link_to でenumのステータスを変更する方法

✏️️ 2019/08/21 👍️2019/08/21 🔗

link_toでenumのステータスを変更するようにします。

Model

draftだったらpublishedに変更、publishedだったらdraftに変更するメソッドを作成します。

enum status: { draft: 0, published: 1, archived: 2 }
validates :status, inclusion: { in: Post.statuses.keys }

def toggle_status!
  draft? ? published! : draft!
end

Controller

toggle_status Action と archived Actionを作成します。

class PostsController < ApplicationController

  before_action :set_post, only: %i[show edit update destroy toggle_status archived]

  
  
  

  def toggle_status
    @post.toggle_status!
    redirect_to edit_admin_post_path(@post), notice: 'Post was successfully updated.'
  end

   def archived
    @post.archived!
    redirect_to admin_posts_path, notice: 'Post was successfully archived.'
  end

  .
  .
  .

  private

  def set_post
    @post = Post.find_by_slug_or_id(params[:id] || params[:post_id])
  end

end

Routing

データの更新なので、patch でRoutingします。

# config/routes.rb

resources :posts do
  patch :toggle_status
  patch :archived
end

View

<%= link_to "#{post.status} にする", post_toggle_status_path(post), method: :patch %>
<%= link_to '🗑', post_archived_path(post), method: :patch, data: { confirm: 'Are you sure?' } %>

以上で、link_to でenumのステータスを変更する方法は完了です。

Akito
日本のスタートアップで主にRuby on Railsを使ってプロダクト開発をしています。