0

私はまだRoRを学んでおり、寝室の数でプロパティをフィルタリングする簡単な検索フィールドを見つけるのに1日かかりました。今は完璧に機能していますが、それが正しい方法かどうかわかりません。バスルーム、最低価格、最高価格、郵便番号などの検索フィールドを追加できるように、それを適応させる方法がわかりません。

検索フィールドと送信ボタンと結果はリストページにあるので、コントローラーには次のようなものがあります。

def list
@properties = Property.bedrooms(params[:bedrooms])
end   

私が持っているモデルでは:

def self.bedrooms(bedrooms)
 if bedrooms
   find(:all, :conditions => ["bedrooms LIKE ?", "%#{bedrooms}%"])
 else
   find(:all)
 end

終わり

list.html.erbページは次のとおりです。

<%= form_tag( 'list', :method => 'get') do %>
<p>
<%= text_field_tag 'bedrooms', (params[:bedrooms]) %>

<%= submit_tag "Search", :name => nil %>
</p>
<% end %>

バスルームの検索フィールド、最低価格の検索フィールド、最高価格の検索フィールド、zipの検索フィールドを追加するにはどうすればよいですか?ありがとう、アダム

これをコントローラーに追加しようとすると、構文エラーが発生します。

scope :bedrooms, {|b| where("bedrooms LIKE ?", b)}  
scope :price_greater, {|p|  where("price > ?", p)}

エラーは次のとおりです。

SyntaxError in PropertiesController#list

/Users/Adam/Documents/Websites/idx_app/app/models/property.rb:4: syntax error,    unexpected '|', expecting '}'
 scope :bedrooms, {|b| where("bedrooms LIKE ?", b)}  
                  ^
/Users/Adam/Documents/Websites/idx_app/app/models/property.rb:4: syntax error, unexpected '}', expecting keyword_end
scope :bedrooms, {|b| where("bedrooms LIKE ?", b)}  
                                                 ^
/Users/Adam/Documents/Websites/idx_app/app/models/property.rb:5: syntax error, unexpected '|', expecting '}'
scope :price_greater, {|p|  where("price > ?", p)}
                       ^
/Users/Adam/Documents/Websites/idx_app/app/models/property.rb:5: syntax error, unexpected '}', expecting keyword_end

はい、ラムダを追加すると上記の構文エラーが修正されましたが、次のエラーメッセージが表示されるため、@propertiesが配列を返さないようになりました。

undefined method `each' for #<Class:0x007fd5235250f8>

Extracted source (around line #29):

26:       <th>Price</th>
27:     
28:     </tr>
29:     <% @properties.each do |property| %>
30:     <tr>
31:       
32:       <td><%= link_to(property.address, {:action => 'show', :id => property.id}) %></td>

このエラーメッセージを修正しました。コントローラーで適切に定義していませんでした。@properties=@properties.allの代わりに@properties.allを配置しました。

4

1 に答える 1

2

スコープを使用してそれを行います...

  scope :bedrooms, lambda{ |b| where("bedrooms LIKE ?", b) }    
  scope :price_greater, lambda{ |p|  where("price > ?", p)  }

コントローラー内

  @properties = Property.scoped
  @properties = @properties.bedrooms(params[:bedrooms]) if params[:bedrooms].present?
  @properties = @properties.price_greater(params[:min]) if params[:min].present?
  .....
  @properties = @properties.paginate.... or just @properties.all
于 2012-05-20T01:25:06.360 に答える