Ransack :: Search对象已提供给search_form_for

时间:2014-05-08 10:28:12

标签: ruby-on-rails ruby ruby-on-rails-3

我正在尝试在网络应用的主页上添加搜索表单来搜索这样的学校;

<%= search_form_for @q, url: schools_path, html: { method: :post, :class => 'course-finder-form' } do |f| %>                
    <%= f.label :school_name_cont %>
    <%= f.text_field :school_name_cont %>
    <%= f.submit %>                                                                        
<% end %><!--//course-finder-form--> 

并且学校控制器看起来像这样;

  def index
    @q = School.search(params[:q])
    @schools = @q.result.order("school_name ASC").page(params[:page]).per(50)    

    respond_to do |format|
     format.html # index.html.erb
     format.json { render json: @schools }
    end
  end

渲染控制器家庭控制器

def index
  @q = School.search
end

但是在运行应用程序时出现此错误;

No Ransack::Search object was provided to search_form_for!

知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

您没有传入搜索对象,而是传递符号:q。调用搜索searchq时,您也无法保持一致。您可以使用其中任何一个,但q现在是Ransack默认值。

在您的观点中更改:

<% search_form_for :q, url: schools_path, html: { method: :post, :class => 'course-finder-form' } do |f| %>

是:

<%= search_form_for @q, url: schools_path, html: { method: :post, :class => 'course-finder-form' } do |f| %>

在您的控制器中更改:

def index
  @search = School.search(params[:q])
  @products = @search.result.order("school_name ASC").page(params[:page]).per(50)
  ...

是:

def index
  @q = School.search(params[:q])
  @products = @q.result.order("school_name ASC").page(params[:page]).per(50)
  ...

此外:

在搜索表单上,您将张贴标签和文本字段。但是如果要通过它进行搜索,则需要实际使用谓词。例如,如果您要搜索特定的学校,则需要在表单上进行更改:

  <%= f.label :school_name %>
  <%= f.text_field :school_name %>

是:

  <%= f.label :school_name_eq %>
  <%= f.text_field :school_name_eq %>

字段名称的末尾有一个额外的_eq谓词 - 这告诉Ransack你想在构建SQL时对学校进行精确搜索。同样,如果您想要任何包含表单上文本的学校,您可以使用:school_name_cont代替。

答案 1 :(得分:1)

解决问题的所有方法的诀窍是简单地用Model.search()替换Model.ransack()

答案 2 :(得分:0)

#app / controller /

before_filter :set_search

def set_search
  @search=Product.search(params[:q])
end

```