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ヶ月も経たないような若造が言ってみたり.