【问题标题】:how to use search form in rails 4如何在rails 4中使用搜索表单
【发布时间】:2014-05-28 05:47:00
【问题描述】:

我有两个控制器类别和产品,关系是application.html.erb 目录下拉菜单中的类别 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

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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您可以使用select_tag 将类别放到下拉菜单中,并在搜索表单上使用options_for_select。您可以通过option_for_select here 阅读有关select_tag 的信息

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

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

    【讨论】:

    • 我更改了一些代码,但它对我的帮助已经足够多了。感谢您的帮助。
    【解决方案2】:

    您可以使用 form_tag 并将该下拉菜单与搜索一起包含在其中。然后在您的控制器中,您可以从该下拉菜单选择中构造一个查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-16
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多