Ruby on rails 如何在Rails应用程序中初始化和显示元标记

Ruby on rails 如何在Rails应用程序中初始化和显示元标记,ruby-on-rails,helpers,Ruby On Rails,Helpers,在页面_controller.rb中: class PagesController < ApplicationController def show @page = Page.find_by(url: params[:url]) @meta = { title: @page.title, description: @page.description, keywords: @page.keywords } end end 因为对于此页面,@meta未初始化 所以我想

在页面_controller.rb中:

class PagesController < ApplicationController
  def show
    @page = Page.find_by(url: params[:url])
    @meta = { title: @page.title, description: @page.description, keywords: @page.keywords }
  end
end
因为对于此页面,@meta未初始化

所以我想我必须用一个默认值初始化@meta[:title]。我应该将此代码放在应用程序中的什么位置


还有一个。我想把@meta赋给一个helper方法。我应该在哪里定义它?

您可以在
应用程序\u控制器中使用before\u过滤器进行定义:

before_filter :initialize_metas

def initialize_metas
    @meta = { title: 'default_title', description: 'default_description', keywords: 'default_keywords' }
end
然后在控制器中继承自
应用程序\u控制器
您可以覆盖它:

@meta = { title: @page.title, description: @page.description, keywords: @page.keywords }
或者只需覆盖/添加所需的关键点:

@meta[:title] = 'another_title'

如果要将其用作类变量

用户@@meta在ApplicationController中


@@创建一个可以在所有项目中使用的类变量,因为all inherit from ApplicationController

在控制器中准备一些与视图相关的数据似乎不是一个好主意。也许,最好为@post对象提供某种演示者。

是的,如果OP希望每个页面上都有相同的元标记。这个解决方案是错误的。例如,在root中获取meta的唯一方法是在root中获取一个变量,在特定的视图控制器中是拥有一个全局变量1。不,这不是唯一的方法。2.它甚至不是全局变量!请告诉我另一种方法来实现这一点,而不是作为我真正想知道的参数传递。抱歉,是不是像iMacTia的回答一样,在
ApplicationController
中的过滤器之前,在所有controllerapp-wide
中继承了一个类变量?你真的不知道这种方式吗?我不得不同意你,我的答案也可以是最快的,但这并不意味着它也是最好的。也许使用助手可能是更好的方法。试着提出一些建议,也许你会得到公认的答案;)
@meta = { title: @page.title, description: @page.description, keywords: @page.keywords }
@meta[:title] = 'another_title'