0
1

More than 3 years have passed since last update.

[Ruby on rails]記事の下書き保存実装 enum使用Ver. とboolean使用Ver. 2パターンやってみた

Last updated at Posted at 2021-08-08

やりたいこと

記事の下書き保存をできるようにしたい。

今回はenumを使用した記事の下書き保存と、
enum使用せずBooleanのみを使用した場合の実装2パターンを行います。

enumを使えば、公開・下書き以外にも、非公開とか色々追加できます。
一方、Booleanは trueかfalseなので、公開か下書きの2択です。
実装自体は、Booleanの方が、ほんの少しだけ簡単だと思います。

enum使用の場合、こうなる

スクリーンショット 2021-08-08 15.34.53.png

Booleanのみの場合、こうなる

スクリーンショット 2021-08-08 15.34.18.png

enumを使用した実装から説明します。

enum:カラムの追加

公開、下書き保存のステータスを保持するカラムを追加しましょう。

postのマイグレーションファイル
t.integer :status,default: 0,null: false

ステータスカラムを追加し、rails db:migrate しましょう。

enum:モデルファイル記述

post.rb
enum status: {draft: 1,published: 0}

enum:ルーティング記述

ユーザーの詳細ページから、
そのユーザーの下書き保存してる記事の一覧を表示したいので、以下の通り記載します。

routes.rb
resources :users, only: [:show,:index,:edit,:update] do
    member do
      get :favorites
      get :confirm
    end
  end

member doって何?という方は以下の記事をご確認ください。
簡単にいうと、users/:id/confirmというルーティングを作れます。

enum:コントローラー記述

post_controller.rb
  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のもののみ表示します。
(下書き記事は表示されません。)

ストロングパラーメーターへの追記も忘れずに!!!

user_controller.rb
省略:::

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ページ

posts/new.html.erb
省略
<div class="form-group">
 <%= f.label"公開範囲を選択" %><br>
 <%= f.select :status, [["公開", "published"], ["下書き", "draft"]],required: true,class:"form-control" %>
</div>
users/show.html.erb
<%=link_to "下書き一覧", confirm_user_path(@user)%>
confirm.html.erb
 <% @posts.each do |post| %>
        <%=link_to post_path(post.id) do %><%= post.title.truncate(25) %>

  <% end %>

次にBooleanを使用した場合の実装を説明します

enumのところでしている説明は省いてます。

Boolean:カラムの追加

公開、下書き保存のステータスを保持するカラムを追加しましょう。

postのマイグレーションファイル
t.boolean :status,default: true

Boolean:ルーティング記述

enumの場合と同じです。

routes.rb
resources :users, only: [:show,:index,:edit,:update] do
    member do
      get :favorites
      get :confirm
    end
  end

Boolean:コントローラー記述

posts_controller.rb
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)の箇所が変わっただけです。

users_controller.rb
 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ページ

posts/new.html.erb
省略
   <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の時と同じです。

users/show.html.erb
<%=link_to "下書き一覧", confirm_user_path(@user)%>
confirm.html.erb
 <% @posts.each do |post| %>
        <%=link_to post_path(post.id) do %><%= post.title.truncate(25) %>

  <% end %>

参考にさせていただいた記事

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1