首先,我是RoR的新手,所以答案可能很明显,在这种情况下我道歉。我环顾四周,找不到任何有用的东西。
我正在尝试在我的应用上的每个网页的标题上都有一个搜索表单,它将搜索我所有“存储桶”的名称。以下是相关代码:
在app / views / layouts / _header.html.erb中(在导航栏中):
<% search_form_for @q do |f| %>
<%= f.label :name_cont %>
<%= f.text_field :name_cont %>
<%= f.submit %>
<% end %>
在app / controllers / buckets_controller.rb中:
def index
unless params[:q].blank?
@q = Bucket.search(params[:q])
@buckets = @q.result.paginate(:page => params[:page])
else
@buckets = Bucket.find(:all, :limit => 5).paginate(:page => params[:page])
end
end
我理解最后一部分并不是那么好:我想要做的就是如果我只是访问存储桶索引页面(而不是通过搜索),我会显示最近创建的5个存储桶。当我在标题表单中搜索某些内容时,我会访问索引页面,但只显示搜索到的内容。 (更好的方法是处理它以使搜索页面与索引页面分开吗?)
我发现this issue几乎完全相同,但如果每个页面都有表格,我仍然看不到我如何处理@q
- 当然我没有改变每个控制器的每一个动作?
对于任何挫折感到抱歉,我的愚蠢是我的原因!
答案 0 :(得分:9)
正如其他人所说,你需要利用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 %>
答案 1 :(得分:1)
不,您不需要编辑所有控制器。
您可以将ApplicationController用于所有“常见”控制器需求。请参阅指南http://guides.rubyonrails.org/action_controller_overview.html和API文档http://api.rubyonrails.org/classes/ActionController/Base.html
这里的关键是,当你生成新的rails应用程序时,你会发现它创建了文件... / app / controllers / action_controller.rb,该类派生自ActionController :: Base。然后,如果你再次使用rails生成器为你的应用程序创建一个控制器,你会注意到你的新控制器类派生自ApplicationController(不是:: Base)。这意味着application_controller.rb是您的应用程序的父控制器类。这意味着所有app控制器都可以使用它中的所有内容。这很容易滥用,所以要明智。
答案 2 :(得分:1)
看起来这是不可能的。这是宝石作者Ernie的评论。
你必须在before_filter中处理Ransack所需的东西 (ick)在视图中部分本身。如果您要打开搜索字段 网站的每一个部分,我都建议你强烈考虑 hansack是否也是这项工作的正确工具。你可能想要 某种倒置索引搜索设置,如sphinx,solr等。