Last active
December 22, 2020 08:10
-
-
Save usutani/408ab1f4b8ce1e9875d38dba5b267e9d to your computer and use it in GitHub Desktop.
Rails: 覚書: DHH流のルーティング
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# メッセージコントローラに下書き用のコントローラを追加する。 | |
# サブリソースのフィルタリング 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