我有两个控制器类别和产品,关系是application.html.erb
catagory下拉菜单中的类别has_many产品和搜索产品的form_tag
。我的要求是当我通过下拉菜单选择任何类别名称并搜索任何产品时,应该显示该类别的产品。如果我在找到任何产品时不会选择任何类别,那么它应该显示与所有类别相关的产品。
<select>
<option value>Catagory by Name</option>
<option value="Samsung">Samsung</option>
<option value="Nokia">Nokia</option>
<option value="Apple">Apple</option>
<option value="HTC">HTC</option>
<option value="Sony">Sony</option>
<option value="Blackbarry">Blackbarry</option>
</select>
<tr><%= form_tag products_path, :method => 'get' do %>
<p>
<%= text_field_tag :search,params[:search],placeholder: "Search Products"%>
<%= submit_tag "search",:name => nil %>
</p>
<% end %></tr>
def index
@products = Product.all
if params[:search]
@products = Product.search(params[:search])
else
@products = Product.all
end
end
def self.search(search)
where("name like ?", "%#{search}%")
end
所以请告诉我如何解决它。
答案 0 :(得分:0)
您可以使用form_tag并在其中包含该下拉菜单以及搜索。然后在您的控制器中,您可以从该下拉菜单选择中构建查询。
答案 1 :(得分:0)
您可以使用select_tag
将类别放入下拉菜单,并在搜索表单上使用options_for_select
。您可以通过select_tag
here
option_for_select
<%= form_tag products_path, :method => 'get' do %>
<p>
<%= select_tag :category_id, options_for_select([["Catagory by Name", nil]] + Category.all.collect {|x| [x.name, x.id]}),{} %>
<%= text_field_tag :search, params[:search], placeholder: "Search Products"%>
<%= submit_tag "search",:name => nil %>
</p>
<% end %>
您不需要@products = Product.all
而逻辑if params[:search]
只需使用此功能:
def index
@products = Product.search(params[:category_id],params[:search])
end
在product.rb
上看起来像这样:
def self.search(category, search)
if search
if category == nil
where("name like ?", "%#{search}%")
else
where("category_id = ? OR name like ?", category, "%#{search}%")
end
else
# use scoped will get Product.all
scoped
end
end
注意:这未经测试,但希望这对您有帮助。