![](/img/trans.png)
[英]Rails: How can I regenerate all the views created by scaffold after I make changes to the underlying table?
[英]Rails: How can I make an object available in all views?
我有一个在我的Galleries控制器中创建并显示在我的Galleries视图中的search
对象:
应用程序/控制器/ galleries_controller.rb
class GalleriesController < ApplicationController
def index
@galleries = Gallery.all
@search = Search.new
end
该对象代表搜索栏。 我想将搜索栏移到我的layouts/application.html.erb
视图中,并使其在标题的所有页面上可用。 这将要求我使search
对象全局可用,但我不确定如何做到这一点。 我尝试坚持使用ApplicationController并认为这将使它在所有视图中都可用,因为所有继承都源于此,但它没有用。 如何使对象在所有视图中可用?
你可以用做before_action
(亦称before_filter
中) 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
操作禁用它。
如果只需要几个控制器,可以在ApplicationController
定义make_search
,然后将before_action :make_search
放入要启用它的控制器中。
将此添加到您的ApplicationController
:
def search
@search ||= Search.new
end
def galleries
@galleries ||= Gallery.all
end
然后,如果实例变量@search
),则在视图中使用该函数( search
); ||=
确保代码仅执行一次(从而节省了数据库查询)。
您可以通过破坏MVC使对象在全局范围内可用,而只需在视图内部创建对象即可:
<% @search = Search.new %>
<%= form_for @search do |form| %>
<%= form.text_field :query, placeholder: "Search for a Picture" %>
<% end %>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.