我正在尝试在网络应用的主页上添加搜索表单来搜索这样的学校;
<%= 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!
知道如何解决这个问题吗?
答案 0 :(得分:1)
您没有传入搜索对象,而是传递符号:q
。调用搜索search
或q
时,您也无法保持一致。您可以使用其中任何一个,但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
```