如何在rails 4中使用搜索表单

时间:2014-05-28 05:47:01

标签: ruby-on-rails

我有两个控制器类别和产品,关系是application.html.erb catagory下拉菜单中的类别has_many产品和搜索产品的form_tag。我的要求是当我通过下拉菜单选择任何类别名称并搜索任何产品时,应该显示该类别的产品。如果我在找到任何产品时不会选择任何类别,那么它应该显示与所有类别相关的产品。

application.html.erb

<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>

product_controller.rb

def index
  @products = Product.all
  if params[:search]
   @products = Product.search(params[:search])
  else
   @products = Product.all
  end
end

product.rb

def self.search(search)
  where("name like ?", "%#{search}%")
end

所以请告诉我如何解决它。

2 个答案:

答案 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]只需使用此功能:

products_controller.rb

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

注意:这未经测试,但希望这对您有帮助。