1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Railsで下書き機能の作成を行った

Posted at

今回はRailsで下書き機能の作成ついて紹介します。

displayカラムの追加

今回は下書き記事かどうかを判断するために、displayカラムを追加します。
add columnコマンドなどを使ってみます。

#db/migrate/20220928135436_add_coumuns_to_posts.rb
class AddCoumunsToPosts < ActiveRecord::Migration[6.1]
  def change
    add_column :posts, :display, :string
  end
end

そしてmigrateします。

rails db:migrate

次にコントローラーを記述します。
内容としては、1だったときは、0にし、elseだと逆に処理をします。
0が下書き、1が投稿です。

#posts_controller.rb

  def draft
    @post = Post.find(params[:id])
    if @post.display == "1"
      @post.update(display: 0)
      redirect_to post_path(@post)
    else
      @post.update(display: 1)
      redirect_to post_path(@post)
    end
  end

そしてViewを作成します。
今回は、投稿ボタンと下書きボタンを分けて作成します。

#post/new.html.erb
<%= render partial: 'layouts/header' %>
<div id="new">

  <%= form_with(model: @post, local: true) do |form| %>
    <div class="field">
      <div class="post_type">
        <div class="label"><%= form.label :post_type, "カテゴリー" %></div>
        <div><%=form.collection_select(:post_type_id, @post_types, :id, :name, include_blank: "選択して下さい") %></div>
      </div>

      <div class="eye_catch">
        <div class="label"><%= form.label :image, "アイキャッチ" %></div>
        <div><%= form.file_field :image %></div>
      </div>

      <div class="title">
        <div class="label"><%= form.label :title, "タイトル" %></div>
        <div><%= form.text_field :title %></div>
      </div>

      <div class="content">
        <div class="label"><%= form.label :content, "投稿内容" %></div>
        <div><%= form.rich_text_area :content %></div>
      </div>

      <%= form.hidden_field :approvement, value: "0" %>

      <div class="submit">
        <%= form.submit "上記内容で投稿する" , name: "release"  %>
      </div>

      <div class="submit">
        <%= form.submit "上記内容を下書きにする" , name: "draft"  %>
      </div>

    </div>
  <% end %>
</div>
<%= render partial: 'layouts/footer' %>

ポイントとしては、nameは投稿はrelease, 下書きはdraftにしている点です。
ここをもし、

 <%= form.submit "上記内容で投稿する" , name: "post"  %>

にするとエラーが出てしまい、上手く処理ができないので、post以外の名前を何か付けましょう。
最後に表示できるか見ます。

表示の確認

#show.html.erb

<%= render partial: 'layouts/header' %>
<div class="blog_page">
  <%# ここにパンくず %>

  <div class="main_contents">
    <%# if user_signed_in? %>
      <%# if current_user.admin == "管理者" %>
        <div class="buttons">
        <% if @post.display == "1" %>

          <%= link_to draft_post_path(@post) do %>
            <div class="edit">
              下書きに戻す
            </div>
          <% end %>
        <% else %> 
          <%= link_to draft_post_path(@post) do %>
            <div class="edit">
              下書き
            </div>
          <% end %>

        <% end %>

          <%= link_to edit_post_path(@post) do %>
            <div class="edit">
              編集
            </div>
          <% end %>
          <%= link_to post_path(@post), method: :delete, data: { confirm: '本当に削除しますか?'} do %>
            <div class="delete">
              削除
            </div>
          <% end %>
        </div>
      <%# end %>
    <%# end %>
    <div class="upper_content">
      <div class="category_names">
        <%= image_tag('icon_all.png', alt: "all", class: "icon_m") %>
        <div class="article_category">
          <%= @post.post_type.name %>
        </div>
      </div>
      <div class="date">
        <% if @post.present? %>
          <%= @post.created_at.to_s(:datetime_jp) %>
        <% end %>
      </div>
    </div>
  

showでうまく切り替えられるか確認しましょう。

スクリーンショット 2022-11-15 20.46.06.png

スクリーンショット 2022-11-15 20.46.17.png

スクリーンショット 2022-11-15 20.46.12.png

下書きボタンを押すと、下書きに戻すに切り替わりました。

あとは一覧ページで下書きだと表示しない用に設定すれば完成です。

1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?