我有一个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,并认为这将使它在所有视图中都可用,因为那里的一切都是固有的,但它没有用。如何在所有视图中使对象可用?
答案 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 %>