正如其他人所说,您需要利用 ApplicationController 的 before_filter 。虽然厄尼本人似乎并不推荐这样做,但实现起来很简单。
首先,使用高级 Ransack 选项来设置搜索路径
#config/routes.rb
resources :buckets do
collection do
match 'search' => 'buckets#search', via: [:get, :post], as: :search
end
end
其次,更新您的 BucketsController 以包含以下自定义操作:
#controllers/buckets_controller.rb
def search
index
render :index
end
还没有什么异常。如果您当前尝试搜索,您将从原始问题中得到错误。您对变量 q 的定义已正确实现,但您必须将其移至 ApplicationController,如下所示:
#controllers/application_controller.rb
before_filter :set_global_search_variable
def set_global_search_variable
@q = Bucket.search(params[:q])
end
最后,更新您的搜索表单以传递正确的搜索选项
#layouts/_header.html.erb
<% search_form_for @q, url: search_buckets_path, html: { method: :post } do |f| %>
<%= f.label :name_cont %>
<%= f.text_field :name_cont %>
<%= f.submit %>
<% end %>