📝

投稿の公開・非公開設定

2024/05/28に公開

①マイグレーションファイルを作成

 create_table "boards", force: :cascade do |t|
    t.string "title", null: false
    t.text "description", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.integer "user_id"
    t.integer "group_id"
    t.integer "status", default: 0, null: false
  end

ここでのstatusカラムが重要です。他は、つけたいもので。

boardモデルにこれを記載

scope :public_boards, -> { where(status: 0) }

これは、statusが0(公開)のboardのみを取得するスコープです。
Board.public_boardsとすることで、公開状態のboardのみを取得できます。

viewにはこれを記載

 <div class="form-group">
 <div><%= form.label :status, "公開状態" %></div>
 <div><%= form.select :status, Board.statuses.keys.map { |status| [status.gsub("_status", "").humanize, status] }, {}, { class: "form-control" } %></div>
 </div>

これを記載することによって、タブが作成され、publicとprivateが選択できるようになります。

boardコントローラーはこれを記載しましょう

 def update
 @board = Board.find(params[:id])
if @board.update(board_params)
 @board.save_tags_new(params[:board][:tag])
redirect_to ???_path(@group) ,notice: '更新に成功しました。'
    else
       render :???
    end
  end
省略
  private
 def board_params
    params.require(:board).permit(:title, :description, :user_id, :group_id, :status)
  end

これらの設定により、以下のような動作が実現されます。

新しく作成されたboardは、デフォルトで公開状態になります。
ユーザーは投稿時に公開・非公開を選択できます。
投稿で設定されたバリデーションに失敗した場合、他人の非公開のboardは提示されません。
公開されたboardのみが一覧ページに表示されます。

注意
:自分が作成したものは、他人には非公開は見えませんが、自分のアカウントで入った際には非公開は見えているプログラムを作成しました。

Discussion