on Rails : そこはDRYだろ

なんだかんだで,ライド・オン・Rails(ちょっともう書くの面倒いし,Ride on Railsって以降書くようにします)をちょくちょく読み,Chapter 2まできました.で,Chapter 1で気づいたことを少しだけ.


さて,皆さんご存知のとおり,RailsにおいてDRYという概念は超重要だ.んで,このRide on Rails,けしからんことにこんなこと書いてる.

1.3.8 蔵書検索

多くの蔵書を登録したので,検索機能をつけたくなりました(中略)ビューにsearch.rhtmlを用意し,コントローラにsearchメソッドを追加します.


まずはビューのファイルをlist.rhtmlからコピーして次のように作成します...

コピーして!?いやそこはDRYを強調するためにも,renderを使用すべきだろう!てことで,ボクはこうしました.


まずは,render先のapp/view/books/book_list.rhtmlから.

<table>
  <tr>
    <th>ISBN</th>
    <th>name</th>
    <th>author</th>
    <th>manufacturer</th>
    <th>release_on</th>
  </tr>
<% @books.each do |book| %>
  <tr>
    <td><%= h book.isbn %></td>
    <td><%= link_to h(book.name), :action => 'show', :id => book %></td>
    <td><%= h book.author %></td>
    <td><%= h book.manufacturer %></td>
    <td><%= h book.release_on %></td>
    <td><%= link_to 'Edit', :action => 'edit', :id => book %></td>
    <td><%= link_to 'Destroy', { :action => 'destroy', 
    :id => book }, :confirm => 'Are you sure?', :post => true %></td>
  </tr>
<% end -%>
</table>


次に,app/view/books/list.rhtmlはこうなる.

<h1>Listing books</h1>
<%= render 'books/book_list' %>
<%= link_to 'Previous page', { :page => @book_pages.current.previous } if @book_pages.current.previous %>
<%= link_to 'Next page', { :page => @book_pages.current.next } if @book_pages.current.next %> 
<br />
<%= link_to 'New book', :action => 'new' %>


最後に,app/view/books/search.rhtmlはこうなった.

<h1>Search Books</h1>
<%= start_form_tag :action => 'search' %>
    keyword: <%= text_field_tag 'keyword', params[:keyword] %>
    <%= submit_tag 'Search' %>
<%= end_form_tag %>
<%= render 'books/book_list' if params[:keyword]%>


Chapter 2では,adminユーザのみEditやDestroyなど使えるようにlogin機能を実装し,そしてビューにおいて,セッションがadminならEdit,Destroyへのリンクを表示,みたいなことをするし,余計にこうした方が良いと思うぜ.てかすべきだろ.


などと,Railsを初めて1ヶ月も経たないような若造が言ってみたり.