使用has_scope gem和collection_select过滤索引

时间:2015-01-28 17:51:50

标签: ruby-on-rails collection-select has-scope

我有两个模型:BusinessCategory。在我的business#index视图中,所有Business名称都会显示在表格中,以及相关的Category。我使用了has_scope gem,并为我的Business模型添加了两个范围::by_categorysearchsearch范围正常。当我从by_category中选择一个类别并提交表单时,collection_select范围不会执行任何操作,但如果我在浏览器中将其硬编码到URL中,则可以正常工作。

我注意到的是,如果我对此网址进行硬编码http://host/businesses?by_category=14则可行。这就是我在日志中看到的内容:

Started GET "/businesses?by_category=14" for 127.0.0.1 at 2015-01-28 11:48:07 -0600
Processing by BusinessesController#index as HTML
Parameters: {"by_category"=>"14"}

但是,当我提交的表单中选择了一个类别时,该网址会显示为http://host/businesses?utf8=%E2%9C%93&search=&category%5Bid%5D=14。当我以这种方式提交表单时,这就是我在日志中看到的内容:

Started GET "/businesses?utf8=%E2%9C%93&search=&category%5Bid%5D=14" for 127.0.0.1 at 2015-01-28 11:45:57 -0600
Processing by BusinessesController#index as HTML
Parameters: {"utf8"=>"✓", "search"=>"", "category"=>{"id"=>"14"}}

我的表单传递by_category param的方式有某些错误,但我无法指责它。 任何帮助将不胜感激。这是相关的代码。

型号:

class Business < ActiveRecord::Base
  belongs_to :category
  ...
  ...
  scope :by_category, -> category { where(:category => category) }
  scope :search, ->(search) { where(arel_table[:title].matches("%#{search}%")) }
end

class Category < ActiveRecord::Base
  has_many :businesses
end

业务总监:

class BusinessesController < ApplicationController
  has_scope :by_category
  has_scope :search
  ...
  def index
    @businesses = apply_scopes(Business).all.page(params[:page])
    @categories = Category.all
  end   
end

商业指数:

....
<%= simple_form_for businesses_path, :method => 'get' do %>
  <%= text_field_tag :search, '', placeholder: "Search..." %>
  <%= collection_select :category, :id, @categories, :id, :name, :prompt => "Select Category" %>
  <%= submit_tag "Search", :name => nil %>
<% end %>
...

1 个答案:

答案 0 :(得分:0)

<强>第一 请注意,您使用方法提交表单:&#39; get&#39;,这就是您的网址编码的原因。

<%= simple_form_for businesses_path, :method => 'get' do %>
  <!-- other code goes here --> 
<% end %>

表格应始终以&#39; post&#39;提交。请求不要&#39;得到&#39;

您应该使用方法:: post ,这将为您提供正确的URL参数(正如您在检查期间所期望的那样)。

第二名:

让&#39;假设,此表单已提交到操作搜索:

def search 
   raise params.inspect 
 end

当你点击这个特定的动作时启用了上面的raise语句,那么这将列出params(哈希)。然后,您始终可以根据需要获取属性。

希望有所帮助:)