タイトルにリンクを設定したい!

一覧表示では、1件を1行で表示しようと思えば、限られた横幅を有効に使わなければならない。前から気になっていたが、現状のsoftwarebook2を見ていると、リンク先URL文字列のためにわざわざ結構な領域を使っている。本来リンクとはキーワードに持たせるものなんだから、ここで表示する必要は無いのだ。Titleにリンクを設定して、Urlは表示しない設定にしてみた。

ビュー list.rhtml
<h1>Listing softwares</h1>

<table>
  <tr>
  <% for column in Software.content_columns %>
    <th><%= column.human_name unless column.name == 'url' %></th>
  <% end %>
  </tr>
  
<% for software in @softwares %>
  <tr>
  <% for column in Software.content_columns %>
    <td><%= link_to_if column.name == 'title',
                       h(software.send(column.name)), 
                       URI.encode(software.send('url')) unless column.name == 'url'  %></td>
  <% end %>
  • 上の方のunless column.name == 'url'で、フィールド名がurlでない時だけ、フィールドのタイトルを表示するようにした。
  • 下の方は、link_to_ifに、unlessなんかが付いてしまって一瞬、戸惑いを感じるが...
    • link_to_ifの後は、リンクを設定するか、しないか、の条件。この条件に関係なく、常にフィールド内容は表示される。そして、もしフィールド名がtitleであれば、urlフィールドの値がリンクとして設定される。
    • unlessの後は、unless手前までのlink_to_if構文全体を実行するか、しないか、の条件。ここではフィールド名がurlでない時だけ、link_to_ifが実行される。つまりフィールド名がurlの時は、何も表示されないことになる。

行数は増やさずに、オプションキーワードの追加設定みたいな感じで実現できてしまった!

      • 経験の浅い自分としては、Rubyの「処理 if 条件」のような書き方は独得だなーと感じていたのだが、使ってみると、たいへん分かりやすい。この構文の狙いはそんなところにあるのかもしれないな...。敢えてブロックで書き直すとこんな感じ
<h1>Listing softwares</h1>

<table>
  <tr>
  <% for column in Software.content_columns %>
    <% unless column.name == 'url' %>
      <th><%= column.human_name %></th>
    <% end %>
  <% end %>
  </tr>
  
<% for software in @softwares %>
  <tr>
  <% for column in Software.content_columns %>
    <% unless column.name == 'url' %>
      <td><%= link_to_if column.name == 'title',
                       h(software.send(column.name)), 
                       URI.encode(software.send('url'))  %></td>
    <% end %>
  <% end %>
      • 2行追加で論理的な3行にするか、後に続けて1行でオプション追加のような気持ちで書くか、個人差もあるだろうが自分は断然1行派だ。これからも可能な限りシンプル1行宣言。(validateから1行の魅力にはまった)