Skip to content

Instantly share code, notes, and snippets.

@usutani
Last active December 22, 2020 08:10
Show Gist options
  • Save usutani/408ab1f4b8ce1e9875d38dba5b267e9d to your computer and use it in GitHub Desktop.
Save usutani/408ab1f4b8ce1e9875d38dba5b267e9d to your computer and use it in GitHub Desktop.
Rails: 覚書: DHH流のルーティング
# メッセージコントローラに下書き用のコントローラを追加する。
# サブリソースのフィルタリング index # 下書き一覧を表示する
# サブリソースのアクション create # 下書きにする、destroy # 清書にする
# confing/routes.rb
Rails.application.routes.draw do
namespace :messages do
resources :drafts, only: :index
end
resources :messages do
resource :draft, only: %i[create destroy], module: 'messages'
end
end
# ------------------------------------------------------------
# アプリの作成
alias r=./bin/rails
alias rr='./bin/rails routes'
rails new try_routing -MCT --skip-active-storage
# メッセージと下書きモデルの準備
# r g scaffold message body is_draft:boolean #フラグで実装する場合
r g scaffold message body
r g model draft message:belongs_to
class Message < ApplicationRecord
has_one :draft, dependent: :destroy
end
r db:migrate
r c
# Fooは下書き、Barは清書で作成する。
Draft.create! message: (Message.create! body: 'Foo1')
Message.create! body: 'Bar1'
exit
# 変更 confing/routes.rb
rr -c messages
rr -c drafts
# 下書きコントローラの生成
r g controller 'messages/drafts' index
# 変更 app/views/messages/index.html.erb
# 下書き一覧へのリンク
<%= link_to 'Drafts', messages_drafts_path %>
# 変更 app/controllers/messages/drafts_controller.rb
# 下書き一覧(下書きがNULLでないメッセージ)
class Messages::DraftsController < ApplicationController
def index
@draft_messages = Message.joins(:draft).where.not(draft: nil).order(:id)
end
# 変更 app/views/messages/drafts/index.html.erb
# app/views/messages/index.html.erb を参考にする
<h1>Drafts</h1>
<table>
<thead>
<tr>
<th>Body</th>
</tr>
</thead>
<tbody>
<% @draft_messages.each do |message| %>
<tr>
<td><%= message.body %></td>
</tr>
<% end %>
</tbody>
</table>
# 変更 app/controllers/messages/drafts_controller.rb
# フィルタリングとサブリソースのアクション
def index
@draft_messages = Message.joins(:draft).where.not(draft: nil).order(:id)
end
def create
Message.find_by(id: params[:message_id])&.create_draft
redirect_to messages_url
end
def destroy
Draft.where(message_id: params[:message_id]).destroy_all
redirect_to messages_url
end
# 変更 app/views/messages/index.html.erb
# 清書と下書きを切り替えるボタン
<th colspan="4"></th>
...
<td>
<% if message.draft.present? %>
<%= button_to 'Publish', message_draft_path(message), method: :delete %>
<% else %>
<%= button_to 'Draft', message_draft_path(message) %>
<% end %>
</td>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment