繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM