Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 标题部分中的ransack搜索表单:未提供搜索表单所需的ransack::search对象_Ruby On Rails_Ruby On Rails 3_Model View Controller_Ruby On Rails 3.1_Ransack - Fatal编程技术网

Ruby on rails 标题部分中的ransack搜索表单:未提供搜索表单所需的ransack::search对象

Ruby on rails 标题部分中的ransack搜索表单:未提供搜索表单所需的ransack::search对象,ruby-on-rails,ruby-on-rails-3,model-view-controller,ruby-on-rails-3.1,ransack,Ruby On Rails,Ruby On Rails 3,Model View Controller,Ruby On Rails 3.1,Ransack,首先,我是RoR新手,所以答案可能很明显,在这种情况下,我道歉。我环顾四周,没有发现任何有用的东西 我正试图在我的应用程序的每个网页的标题处都有一个搜索表单,它将搜索我所有“bucket”的名称。以下是相关代码: 在app/views/layouts/_header.html.erb中(导航栏内): 我知道最后一部分不是很好:我想做的是,如果我只是访问bucket index页面(不是通过搜索),我会显示最近创建的5个bucket。当我在标题表单中搜索某些内容时,我访问索引页面,但只显示命中搜索

首先,我是RoR新手,所以答案可能很明显,在这种情况下,我道歉。我环顾四周,没有发现任何有用的东西

我正试图在我的应用程序的每个网页的标题处都有一个搜索表单,它将搜索我所有“bucket”的名称。以下是相关代码:

在app/views/layouts/_header.html.erb中(导航栏内):

我知道最后一部分不是很好:我想做的是,如果我只是访问bucket index页面(不是通过搜索),我会显示最近创建的5个bucket。当我在标题表单中搜索某些内容时,我访问索引页面,但只显示命中搜索的bucket。(将搜索页面与索引页面分开是更好的处理方式吗?)

我发现这几乎是一样的,但我仍然不知道我如何处理
@q
,如果每个页面上都有表单——当然我不必改变每个控制器的每个动作


提前为任何挫折感到抱歉,我的无知,我的事业,你

否,您不需要编辑所有控制器

您可以使用ApplicationController满足所有“通用”控制器需求。请阅读指南和API文档中的相关内容


这里的关键是,当您生成新的rails应用程序时,您会注意到它创建了文件…/app/controllers/action\u controller.rb,该类派生自ActionController::Base。然后,如果再次使用rails生成器为应用程序创建控制器,您会注意到新的控制器类派生自ApplicationController(而不是::Base)。这意味着应用程序_controller.rb是应用程序的父控制器类。这意味着所有应用程序控制器都可以使用其中的所有内容。这很容易被滥用,所以要明智

看来这是不可能的。这是gem作者厄尼的评论

你必须在一个过滤前或过滤后处理所需的物品 (ick)在局部视图本身中。如果要在上放置搜索字段 每一个网站的一部分,我建议你强烈考虑 搜救是否也是这项工作的正确工具。你可能想要 一些倒排索引搜索设置,如sphinx、solr等


正如其他人所说,您需要利用ApplicationController的before\u过滤器。尽管厄尼本人似乎不建议这样做,但实现起来很简单

首先,使用高级搜索选项设置搜索路径

#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 %>
#layouts/_header.html.erb

我已查看了推荐的记录,但运气不佳。你能和我分享你的想法吗answer@Vezu看看新的答案。好的。这样,搜索url就会变成
my rails app.com/buckets/search
#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 %>