タイトルにリンクを設定したい!
一覧表示では、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行の魅力にはまった)
-