📝
投稿の公開・非公開設定
①マイグレーションファイルを作成
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