在 Rails 页面上添加元数据时,我尝试过 Facebook 的 Open Graph 协议。我现在要做的是使我的代码不重复或干燥---而不是为我拥有的每个控制器页面放置一个元数据标题,我想创建一个名为“MyMetaBuilder”的基类,它将被继承通过子页面,但不知道从哪里以及如何开始编码...有人建议必须根据上下文动态生成元数据属性值。比如PlayMetaBuilder、CookMetaBuilder等等……
另外,当对控制器动作进行单元测试时,我如何验证它的存在?
非常感谢。
在 Rails 页面上添加元数据时,我尝试过 Facebook 的 Open Graph 协议。我现在要做的是使我的代码不重复或干燥---而不是为我拥有的每个控制器页面放置一个元数据标题,我想创建一个名为“MyMetaBuilder”的基类,它将被继承通过子页面,但不知道从哪里以及如何开始编码...有人建议必须根据上下文动态生成元数据属性值。比如PlayMetaBuilder、CookMetaBuilder等等……
另外,当对控制器动作进行单元测试时,我如何验证它的存在?
非常感谢。
我为 Scoutzie 所做的,是将所有元数据放入一个头部部分,if/else 情况如下:
%meta{:type => 'Author', :content => "Kirill Zubovsky"}
%meta{'property' => "og:site_name", :content=>"Scoutzie"}
-if @designer
...
-elsif @design
...
-else
...
这样,根据加载的变量,我知道它是哪个页面,从而知道要包含哪些元数据。这可能不是一个优雅的解决方案,但它确实有效并且非常简单。
一件事是定义标签,另一件事是渲染它们。我会做以下事情:
编写一个控制器混合(类似于acts_as_metatagable),我将为每个控制器定义特定字段(并用默认值填充其余字段)。这些将被分配给类(或实例)变量,并以这种方式在渲染步骤中可访问)。
编写一个辅助函数,它将获取我所有的标签并将它们转换为 html。然后将在布局中调用此辅助函数并在文档的头部呈现。
所以,它看起来有点像这样: # homepage_controller.rb class HomepageController < ActionController::Base # option 1.2: 在下面直接包含它 # include ActsAsMetatagable act_as_metatagable :title => "Title", :url => homepage_url结尾
# lib/acts_as_metatagable.rb
module ActsAsMetatagable
module MetatagableMethods
#option 2.2: insert og_tags method here and declare it as helper method
def og_metatags
@og_tags.map do |k, v|
# render meta tags here according to its spec
end
end
def self.included(base)
base.helper_method :og_tags
end
end
def acts_as_metagabable(*args)
include MetatagableMethods
# insert dirty work here
end
end
# option 1.1: include it in an initializer
# initializers/acts_as_metatagable.rb
ActiveController::Base.send :include, ActsAsMetatagable
# option 2.1: insert og_metatags helper method in an helper
module ApplicationHelper
def og_metatags
@og_tags.map do |k, v|
# render meta tags here according to its spec
end
end
end