Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 向Rails中的布局发送数据的最佳实践是什么_Ruby On Rails - Fatal编程技术网

Ruby on rails 向Rails中的布局发送数据的最佳实践是什么

Ruby on rails 向Rails中的布局发送数据的最佳实践是什么,ruby-on-rails,Ruby On Rails,我想知道什么是将数据从控制器高效地发送到布局的最佳方式。通常,我使用带有yield指令的布局来呈现页面。这就是我的布局 <!DOCTYPE HTML> <html lang="en"> <head> <%= yield(:title) %> </head> <body> <%= yield %> </body> </html> 和视图文件 <% content_

我想知道什么是将数据从控制器高效地发送到布局的最佳方式。通常,我使用带有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实例变量

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

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

谢谢

有两种方法:

  • ApplicationController
  • 在初始设置“默认”值

  • 控制器

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

    #app/controllers/application_controller.rb
    class ApplicationController < ActionController::Base
      before_action :set_meta
    
      private
    
      def set_meta
        @title ||= ...
      end
    end
    
    我们使用了其中一个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>
    
    #config/settings.yml
    地点:
    标题:
    关键词:
    #app/views/layouts/application.html.erb
    
    #config/initializers/meta.rb
    META = {
      title:    Option.find_by name: "title"
      keywords: Option.find_by name: "keywords"
    }
    
    #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>