SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Railsによるクライアントサイド開発入門

Rails 7で簡単にSPA開発! Turbo StreamsとJavaScript利用を支援するStimulus

Railsによるクライアントサイド開発入門 第6回

  • X ポスト
  • このエントリーをはてなブックマークに追加

編集機能と削除機能の実装

 残る処理は、編集機能と削除機能です。一覧ページには[Show this word]リンクがあるのみなので、編集、削除するにはページ遷移が必要になってしまいます。SPAらしく、一覧ページで編集と削除もできるようにするために、[Show this word]リンクの替わりに[Edit this word]リンクと[Destroy this word]ボタンを置きます。また、一覧の各項目を操作可能にするために、一覧ページの各項目をフレームで囲みます。

リスト app/views/words/index.html.erb
<div id="words">
  <% @words.each do |word| %>
    <%# フレームで囲む %>
    <%= turbo_frame_tag word do %>
      <%= render word %>
      <p>
        <%# 編集リンクと削除ボタンを置く %>
        <%= link_to "Edit this word", edit_word_path(word) %> |
        <%= button_to "Destroy this word", word, method: :delete %>
      </p>
    <% end %>
  <% end %>
</div>

 項目をフレームで囲ったので、編集フォームでの置き換えができるようになります。そこで、編集フォームであるedit.html.erbをリストのようにフレームで囲みます。また、[Show this word]リンクは意味がないので削除してしまいます。

リスト app/views/words/edit.html.erb
<%# フレームで囲む %>
<%= turbo_frame_tag @word do %>
  <%= render "form", word: @word %>
  <br>
  <div>
    <%# 元に戻るリンクだけを置く %>
    <%= link_to "Back to words", words_path %>
  </div>
<% end %>

 turbo_frame_tagメソッドの引数にモデルオブジェクトを与えていますので、id属性が一覧側と一致するようになります(図3)。

図3 項目表示が編集フォームに置き換わる
図3 項目表示が編集フォームに置き換わる

 この時点ではフォームに置き換わるだけなので、更新と削除でStreamsアクションを返すように、コントローラのupdateアクションメソッドとdeleteアクションメソッドをそれぞれリストのように変更します。

リスト app/controllers/words_controller.rb
def update
  if @word.update(word_params)
    # showビューをレンダリングして返す
    render :show
  else
…略…
end

def destroy
  @word.destroy
  # 削除メソッドの呼び出しをレンダリングして返す
  render turbo_stream: turbo_stream.remove(@word)
end

 updateメソッドでは、更新に成功したらshowビュー(show.html.erb)をレンダリングして返すようになっています(本来は詳細ページであるshowビューである必要はないのですが、簡略化のためこのようにしています)。turbo_frame_tagメソッドの引数の@wordによって項目固有のid属性となるので、編集された項目のフレームがこの内容によって更新されます。[Back to words]リンクは意味がなく、一覧ページのスタイルに合わせるために削除しています。

リスト app/views/words/show.html.erb
<%# フレームで囲む %>
<%= turbo_frame_tag @word do %>
  <%= render @word %>
  <div>
    <%= link_to "Edit this word", edit_word_path(@word) %> |
    <%= button_to "Destroy this word", @word, method: :delete %>
  </div>
<% end %>
図4 編集結果が一覧に反映される
図4 編集結果が一覧に反映される

 destroyメソッドでは、削除後に「turbo_stream: turbo_stream.remove(@word)」をレンダリングして返すようになっています。これは、コンテンツタイプをTurbo Streamとして返すためのショートカットで、内容は「turbo_stream.remove(@word)」となります。これにより、削除した項目が一覧ページからも削除されます(図5)。

図5 削除が実行された
図5 削除が実行された

次のページ
TurboでのJavaScriptの利用を支援するStimulus

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Railsによるクライアントサイド開発入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook <個人紹介> WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/16950 2022/12/27 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング