写経 (10分で作るRailsアプリ) その 2

これくらいガンガン作らねば、と思いつつも進捗微妙。とりあえず気づきをメモ。あまり参考にはならないと思います。

一覧な view の修正

とりあえず、一件データを追加してみたんですが、テキストにある通り

という不具合がぱっと見あり。

テキストによる解ではテーブルから定義リストにしています。微妙な気もするが、とりあえず写経ってコトで。とりあえず、現時点の写経な実行結果は略されているらしいんで微妙に先走ったコードを以下に。

app/views/item/list.rhtml

<dl>
<% for item in @items %>
  <dt><a href="<%=h item.url %>"><%=h item.title%></a></dt>
  <dd><%=h item.description %>
    <%= link_to '[Edit]', {:action => 'edit', :id => item} %>
    <%= link_to '[x]', {:action => 'destroy', :id => item}, :confirm => 'Are you sure?' %>
  </dd>
<% end %>
</dl>

<%= link_to 'Previous page', { :page => @item_pages.current.previous } if @item_pages.current.previous %>
<%= link_to 'Next page', { :page => @item_pages.current.next } if @item_pages.current.next %>

<br />

<%= link_to 'New item', :action => 'new' %>

上記リストを見て分かるのが、

  • 表示されているページを管理しているのが、@item
  • ページ遷移なナニを管理しているのが、@item_pages

てのが見てとれます。

あと、link_to というメソッドについてはきちんとチェキ入れる必要あり、かも。
# link_to の api リファレンス

validation

AWDwR に validation のナニが出ていたような記憶がオボロげにあるが忘却の彼方。とりあえずここでは写し書きを (こら

app/models/item.rb

class Item < ActiveRecord::Base
  validates_presence_of :url, :title
  validates_format_of :utl, :with => /:\/\//
  validates_length_of :description, :within => 0..512
end

エラーメセジの日本語化については以下を参考に、との記述あり。(わしもブックマークしてると思う)
ヽ( ・∀・)ノきゅまきゅまー

てか、この記事って masuidrive の人が書いてるのか。

検索

これも理屈では簡単なコトが分かっていたのですが実装見ておったまげ、ですな。しかし結構前からいぢくり回す、と言いつつも今さらなナニが本当に情けなひ。

で、これも写経ベースで、と思っていたら

  • UTF な環境が微妙でハマった
  • テキストボックスが表示されぬ、と思ってたらタグが imput になってた (恥

とゆー微妙なナニが ...

一応以下にコードを。

app/controllers/item_controller.rb (の一部)

  def list
    if @params[:keyword]
      keyword = "%"+@params[:keyword]+"%"
      @item_pages, @items = paginate :item, :per_page => 10,
      :conditions => [" url LIKE ? OR title LIKE ? OR description LIKE ?", keyword, keyword, keyword]
    else
      @item_pages, @items = paginate :items, :per_page => 10
    end
  end

:conditions に設定している配列は最初の要素の ? がそれ以降の要素で置き換えられるとの事。同時にエスケープ処理も実行されるとの事。きちんと調べた方が良いな。と言うのもこの機能は SQL インジェクション対策にも有効、とある。それにしても至れり尽くせりだなぁ。

app/view/item/list.rhtml

<%= form_tag :action => "list" %>
キーワード:
<input name="keyword" value="<%=h @params[:keyword] %>"/>
<%= submit_tag "検索" %>
<%= end_form_tag %>

<dl>
<% for item in @items %>
  <dt><a href="<%=h item.url %>"><%=h item.title%></a></dt>
  <dd><%=h item.description %>
    <%= link_to '[Edit]', {:action => 'edit', :id => item} %>
    <%= link_to '[x]', {:action => 'destroy', :id => item}, :confirm => 'Are you sure?' %>
  </dd>
<% end %>
</dl>

<%= link_to 'Previous page', { :page => @item_pages.current.previous, :keyword => @params[:keyword] } if @item_pages.current.previous %>
<%= link_to 'Next page', { :page => @item_pages.current.next, :keyword => @params[:keyword] } if @item_pages.current.next %> 

<br />

<%= link_to 'New item', :action => 'new' %>

次は login_generator の実装らしい。