目的
Railsにデフォルトで入っているTurboの理解を深める
前提
- 記事=Memoモデル
- タグ=ActsAsTaggableOn::Tagモデル
- このブログの管理画面にタグの追加/解除機能はもともと存在していて、追加/削除のたびに画面遷移していた
- タグの追加/解除はシンプルにcreate/destroyアクションで行っている
やったこと
このブログの管理画面で、記事に対するタグの追加/解除を画面遷移無しでできるようにする
Viewの変更
タグの追加/削除ボタンのまわりを turbo_frame_tag
ヘルパーで囲う
app/views/admin/memos/_tag.html.erb
<%= turbo_frame_tag tag do %>
<% if memo.tag_list.include?(tag.name) %>
<%= button_to tag.name, admin_memo_tags_path(memo, name: tag.name), method: :delete, class: "Label color-bg-accent-emphasis color-fg-on-emphasis m-1" %>
<% else %>
<%= button_to tag.name, admin_memo_tags_path(memo, name: tag.name), method: :post, class: "Label m-1" %>
<% end %>
<% end %>
create.turbo_stream.erbを追加
app/views/admin/memo_tags/create.turbo_stream.erb
<%= turbo_stream.replace @tag do %>
<%= render "admin/memos/tag", memo: @memo, tag: @tag %>
<% end %>
destroy.turbo_stream.erbを追加(今のところcreate.turbo_stream.erbと同じ)
app/views/admin/memo_tags/destroy.turbo_stream.erb
<%= turbo_stream.replace @tag do %>
<%= render "admin/memos/tag", memo: @memo, tag: @tag %>
<% end %>
Controllerの変更
createアクションで、turbo_streamのリクエストに対してcreate.turbo_stream.erbを返せるようにする
def create
respond_to do |format|
format.turbo_stream
format.html { redirect_to(admin_memo_url(@memo), notice: "Tag added.") }
end
end
destroyアクションで、turbo_streamのリクエストに対してdestroy.turbo_stream.erbを返せるようにする
def destroy
respond_to do |format|
format.turbo_stream
format.html { redirect_to(admin_memo_url(@memo), notice: "Tag removed.") }
end
end
これで画面遷移無しでタグの追加/解除ができるようになる。
所感
- Turbo Streamsのメソッドのうちreplaceは取り入れやすいと思う
- appendやafterなどは画面構成を変えた方が良いことが多そう