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

<h2>やりたいこと</h2>
記事の下書き保存をできるようにしたい。

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

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

<h4>enum使用の場合、こうなる</h4>
![スクリーンショット 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)

<h4>Booleanのみの場合、こうなる</h4>

![スクリーンショット 2021-08-08 15.34.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/da34e853-c10b-62c4-039f-f98e9c21fce1.png)

<h2>enumを使用した実装から説明します。</h2>

<h2>enum:カラムの追加</h2>

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

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

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

<h2>enum:モデルファイル記述</h2>

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

<h2>enum:ルーティング記述</h2>

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

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

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

https://qiita.com/ki_87/items/ba7de81d637aaf85e561


<h2>enum:コントローラー記述</h2>

```perl: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のもののみ表示します。
（下書き記事は表示されません。）

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

```perl: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
```

ユーザーの詳細ページでは、そのユーザーの投稿記事（公開記事）を表示しています。
そこに下書き記事一覧へのリンクを表示し、
下書き記事一覧ページへ飛べるようにしています。

　<h2>enum:Viewページ</h2>

```perl:posts/new.html.erb
省略
<div class="form-group">
 <%= f.label"公開範囲を選択" %><br>
 <%= f.select :status, [["公開", "published"], ["下書き", "draft"]],required: true,class:"form-control" %>
</div>
```




```perl:users/show.html.erb
<%=link_to "下書き一覧", confirm_user_path(@user)%>
```

```perl:confirm.html.erb
 <% @posts.each do |post| %>
        <%=link_to post_path(post.id) do %><%= post.title.truncate(25) %>
    
  <% end %>

```

<h2>次にBooleanを使用した場合の実装を説明します</h2>
enumのところでしている説明は省いてます。

<h2>Boolean:カラムの追加</h2>

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

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

<h2>Boolean:ルーティング記述</h2>

enumの場合と同じです。

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

<h2>Boolean:コントローラー記述</h2>

```perl: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)```の箇所が変わっただけです。

```perl: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
```


<h2>Boolean:Viewページ</h2>

```perl: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の時と同じです。


```perl:users/show.html.erb
<%=link_to "下書き一覧", confirm_user_path(@user)%>
```

```perl:confirm.html.erb
 <% @posts.each do |post| %>
        <%=link_to post_path(post.id) do %><%= post.title.truncate(25) %>
    
  <% end %>

```

<h2>参考にさせていただいた記事</h2>

https://pgmg-rails.com/blogs/21