0

我有两个模型:BusinessCategory. 在我business#index看来,所有Business名称及其关联的Category. 我正在使用gem 并在我的模型has_scope中添加了两个范围:和. 范围工作正常。当我从表单中选择一个类别并提交表单时,范围没有任何作用,但如果我将它硬编码到浏览器中的 URL 中,它就可以正常工作。Business:by_categorysearchsearchby_categorycollection_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"}

但是,当我提交选择了类别的表单时,URL 显示为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不能把手指放在上面。任何帮助将不胜感激。这是相关的代码。

楷模:

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 %>
...
4

1 回答 1

0

1st: 注意这里,你提交的表单使用了一个方法:'get',这就是你的 URL 被编码的原因。

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

表单应始终使用 'post' 请求而不是 'get' 提交。

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

第二:

假设,这个表单被提交给一个动作搜索:

def search 
   raise params.inspect 
 end

当您点击此特定操作时启用上述 raise 语句,然后这将列出参数(在哈希中)。然后,您可以随时根据需要获取属性。

希望有帮助:)

于 2015-01-28T19:19:49.393 回答