やりたいこと
記事の下書き保存をできるようにしたい。今回はenumを使用した記事の下書き保存と、
enum使用せずBooleanのみを使用した場合の実装2パターンを行います。
enumを使えば、公開・下書き以外にも、非公開とか色々追加できます。
一方、Booleanは trueかfalseなので、公開か下書きの2択です。
実装自体は、Booleanの方が、ほんの少しだけ簡単だと思います。
enum使用の場合、こうなる
![スクリーンショット 2021-08-08 15.34.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/2cb5d514-b8ce-b074-b046-59359dcba708.png)Booleanのみの場合、こうなる
enumを使用した実装から説明します。
enum:カラムの追加
公開、下書き保存のステータスを保持するカラムを追加しましょう。
t.integer :status,default: 0,null: false
ステータスカラムを追加し、rails db:migrate しましょう。
enum:モデルファイル記述
enum status: {draft: 1,published: 0}
enum:ルーティング記述
ユーザーの詳細ページから、
そのユーザーの下書き保存してる記事の一覧を表示したいので、以下の通り記載します。
resources :users, only: [:show,:index,:edit,:update] do
member do
get :favorites
get :confirm
end
end
member doって何?
という方は以下の記事をご確認ください。
簡単にいうと、users/:id/confirm
というルーティングを作れます。
enum:コントローラー記述
def index
@posts = Post.where(status: :published).order(params[:sort]).page(params[:page]).per(12)
省略
def post_params
params.require(:post).permit(:title, :content,:status)
end
並び替えを実装済なので、(params[:sort])になってます。ご注意ください。
記事の一覧画面では、statusが:publishedのもののみ表示します。
(下書き記事は表示されません。)
ストロングパラーメーターへの追記も忘れずに!!!
省略:::
def show
@user=User.find(params[:id])
@posts=Post.page(params[:page]).per(8)
@posts = Post.where(status: :published).order("created_at DESC").page(params[:page]).per(8)
end
def confirm
@user = User.find(params[:id])
@posts = @user.posts.where(status: false).order('created_at DESC').page(params[:page]).per(20)
end
ユーザーの詳細ページでは、そのユーザーの投稿記事(公開記事)を表示しています。
そこに下書き記事一覧へのリンクを表示し、
下書き記事一覧ページへ飛べるようにしています。
enum:Viewページ
省略
<div class="form-group">
<%= f.label"公開範囲を選択" %><br>
<%= f.select :status, [["公開", "published"], ["下書き", "draft"]],required: true,class:"form-control" %>
</div>
<%=link_to "下書き一覧", confirm_user_path(@user)%>
<% @posts.each do |post| %>
<%=link_to post_path(post.id) do %><%= post.title.truncate(25) %>
<% end %>
次にBooleanを使用した場合の実装を説明します
enumのところでしている説明は省いてます。Boolean:カラムの追加
公開、下書き保存のステータスを保持するカラムを追加しましょう。
t.boolean :status,default: true
Boolean:ルーティング記述
enumの場合と同じです。
resources :users, only: [:show,:index,:edit,:update] do
member do
get :favorites
get :confirm
end
end
Boolean:コントローラー記述
def index
@posts = Post.where(status: :true).order(params[:sort]).page(params[:page]).per(12)
省略
def post_params
params.require(:post).permit(:title, :content,:status)
end
enumでの実装から、(status: :true)
の箇所が変わっただけです。
def show
@user=User.find(params[:id])
@posts=Post.page(params[:page]).per(8)
@posts = Post.where(status: :true).order("created_at DESC").page(params[:page]).per(8)
end
def confirm
@user = User.find(params[:id])
@posts = @user.posts.where(status: false).order('created_at DESC').page(params[:page]).per(20)
end
Boolean:Viewページ
省略
<div class="form-group row">
<%=f.label:"公開範囲",class:"col-sm-4"%>
<div style="padding-right:20px;">
<%= f.radio_button :status, "販売中",checked: true %>
<%= f.label :status, "公開", {value: :true, style: "display: inline-block;"} %></div>
<div style="padding-right:20px;">
<%= f.radio_button :status, :false %>
<%= f.label :status, "下書き保存", {value: :false, style: "display: inline-block;"} %></div>
</div>
以下はenumの時と同じです。
<%=link_to "下書き一覧", confirm_user_path(@user)%>
<% @posts.each do |post| %>
<%=link_to post_path(post.id) do %><%= post.title.truncate(25) %>
<% end %>
参考にさせていただいた記事