在pages_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
在布局中,我使用这种方式来显示页面的元标题:
<title><%= @meta[:title] %></title>
但是当我去其他页面时,例如根页(“/”)我有一个错误
undefined method `[]' for nil:NilClass
因为这个页面没有初始化@meta。
所以我认为我必须使用默认值初始化@meta [:title]。应用程序应该在哪里放置此代码?
还有一个。我想将@meta分配给辅助方法。我应该在哪里定义它?
答案 0 :(得分:2)
您可以使用before_filter:
在application_controller
中执行此操作
before_filter :initialize_metas
def initialize_metas
@meta = { title: 'default_title', description: 'default_description', keywords: 'default_keywords' }
end
然后在您的控制器中继承而不是从application_controller
继承,您可以覆盖它:
@meta = { title: @page.title, description: @page.description, keywords: @page.keywords }
或只是覆盖/添加您需要的密钥:
@meta[:title] = 'another_title'
答案 1 :(得分:1)
似乎在控制器中准备一些与视图相关的数据是个坏主意。也许,最好为你的@post对象提供某种演示者。
答案 2 :(得分:0)
如果要将其用作类变量
ApplicationController中的User @@ meta
@@创建一个可以在所有项目中使用的类变量,因为它们都继承自ApplicationController