(4)削除の警告で削除対象のTitle項目を表示する

該当箇所の変更

削除警告のウィンドウは、link_toのオプション設定によって表示されている。

ビュー list.rhtml
app/views/softwares/list.rhtml
<% for software in @softwares %>
  <tr>
  <% for column in Software.content_columns %>
    <td><%= link_to_if column.name == 'url',
                       h(software.send(column.name)), 
                       software.send(column.name)  %></td>
  <% end %>
    <td><%= link_to 'Show', :action => 'show', :id => software %></td>
    <td><%= link_to 'Edit', :action => 'edit', :id => software %></td>
    <td><%= link_to 'Destroy', { :action => 'destroy', :id => software }, :confirm => 'Are you sure?', :post => true %></td>
  </tr>
<% end %>

該当箇所をこのように変更してみた。(項目ごとに改行を入れた、変更したのは太字の部分だけ)

    <td><%= link_to 'Destroy',
                      { :action => 'destroy', :id => software },
                      :confirm => "#{software.title} is deleted. Are you sure?",
                      :post => true %></td>

これで何を削除するか教えてくれるようになった。

#{software.title} は、何をやっているのか?

ダブルか、シングルか、クォーテーションの違いを考えた。ダブルでもシングルでも、囲まれた中身はどちらも同じ「文字列」を表す。違いを知るためには、上記の該当箇所でシングルに替えて実行してみて、すぐ分かった。

書き方 表示
ダブル "#{software.title} is deleted. Are you sure?" Ruby is deleted. Are you sure?
シングル '#{software.title} is deleted. Are you sure?' #{software.title} is deleted. Are you sure?

つまり、ダブルクォーテションの中で、このように#{Rubyのコード}書かれていると、「Rubyのコード」が実行された結果の文字列で置き換わる。シングルクォーテションの場合は、中身はそのままの文字列として扱われる。この先よく使いそうな便利機能だ。
今回の場合は、変数softwareにデータベースの1件ずつのデータが入る。これを表示件数分繰り返している。1行目はタイトルがRubyなので、そこで「software.title」を実行すると「Ruby」という結果が返ってくるのだ。

link_toメソッドの構文

link_to 表示文字列, { :action => メッソド名, id: => データベースのテーブルid }, :confirm => 警告メッセージ, :post => true
  • 表示文字列に、メッソッド名/idを呼び出すリンクを作成する。
  • メソッド呼び出しの前に、警告ウィンドウにメッセージを表示して確認する。
  • :post => trueが指定されているので、POST扱いでデータ送信される。