【问题标题】:What is the best practice to send data to layout in Rails在 Rails 中将数据发送到布局的最佳实践是什么
【发布时间】:2016-02-09 03:03:58
【问题描述】:

我想知道有效地将数据从控制器发送到布局的最佳方法是什么。通常,我使用带有 yield 指令的布局来呈现页面。所以这是我的布局

<!DOCTYPE HTML>
<html lang="en">
<head>
    <%= yield(:title) %>
</head>
<body>
    <%= yield %>
</body>
</html>

和视图文件

<% content_for :title do %>
    <title><%= @title %></title>
<% end %>

<section id="page-body">
   <!-- CONTENT GOES HERE -->
</section>

使用这种方法,我必须在控制器中在其视图中需要@title 数据的每个方法中定义@title 实例变量。

真正的问题是我的标题和其他元数据存储在数据库中,因为视图使用相同的布局文件。所以我认为标题和关键字等这些数据不应该被加载得太频繁(至少,不是在每个方法中),也不应该在每个视图中声明 content_for。

那么布局有没有办法直接从控制器访问这些数据呢?不使用 content_for

谢谢

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    有两种方式:

    1. 设置ApplicationController中的值
    2. 在初始化时设置“默认”值

    控制器

    如果您是subclassing,您的控制器来自ApplicationController,则始终会调用ApplicationController。这意味着如果您想要/需要从数据库中设置值,您可以使用 before_action 回调:

    #app/controllers/application_controller.rb
    class ApplicationController < ActionController::Base
      before_action :set_meta
    
      private
    
      def set_meta
        @title ||= ...
      end
    end
    

    然后您将按如下方式填充布局:

    #app/views/layouts/application.html.erb
    <title><%= @title || "Fallback" %></title>
    

    --

    默认值

    如果您有想要填充 layout 的站点范围的数据,最好使用初始化器设置 defaults / constants

    #config/initializers/meta.rb
    META = {
      title:    Option.find_by name: "title"
      keywords: Option.find_by name: "keywords"
    }
    

    我们使用"config" gem 之一来填充此数据:

    #config/settings.yml
    site:
      title:    <%= Option.find_by name: "title" %>
      keywords: <%= Option.find_by name: "keywords" %>
    
    #app/views/layouts/application.html.erb
    <title><%= yield(:title) || Settings.title %></title>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      相关资源
      最近更新 更多