Rails:如何在所有视图中使对象可用?

时间:2014-12-31 12:05:26

标签: ruby-on-rails

我有一个search对象,它在我的Galleries控制器中创建并显示在我的画廊视图中:

app / controllers / galleries_controller.rb

class GalleriesController < ApplicationController
  def index
    @galleries = Gallery.all
    @search = Search.new
  end

此对象代表搜索栏。我想将搜索栏移动到我的layouts/application.html.erb视图中,并使其在标题中的所有页面上都可用。这需要我使search对象全局可用,我不知道该怎么做。我试着坚持使用ApplicationController,并认为这将使它在所有视图中都可用,因为那里的一切都是固有的,但它没有用。如何在所有视图中使对象可用?

3 个答案:

答案 0 :(得分:4)

您可以使用before_action中的before_filter(aka。ApplicationController)来执行此操作,您的所有控制器都应该从中继承。

class ApplicationController < ActionController::Base
  before_action :make_search

  def make_search
    @galleries = Gallery.all
    @search = Search.new
  end
end

这将使该功能在每个动作之前运行。

如果需要,您可以使用skip_before_action :make_search在特定控制器中禁用它,或skip_before_action :make_search, only: :index仅为控制器的index操作禁用它。

如果你只需要一些控制器,你可以在make_search中定义ApplicationController,并将before_action :make_search放在你想要启用它的控制器中......

答案 1 :(得分:1)

将此添加到您的ApplicationController

def search
  @search ||= Search.new
end

def galleries
  @galleries ||= Gallery.all
end

然后,如果实例变量search),则在视图中使用函数(@search); ||=确保代码只执行一次(从而保存数据库查询)。

答案 2 :(得分:0)

您可以通过打破MVC使对象全局可用,只需在视图中创建对象:

    <% @search = Search.new %>
    <%= form_for @search do |form| %>
      <%= form.text_field :query, placeholder: "Search for a Picture" %>
    <% end %>