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

时间:2014-11-13 09:56:59

标签: ruby-on-rails helpers

在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分配给辅助方法。我应该在哪里定义它?

3 个答案:

答案 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