【发布时间】:2011-08-04 07:32:15
【问题描述】:
我有一个名为 Snippet 的模型,它包含 HTML 的 sn-ps 以推送到视图中。
模型有一个列 CODE 和另一个 CONTENT
我想在我的观点中写这样的东西并把内容拿回来
<%= raw Snippet.PHONE_NUMBER %>
在 CODE 上查找 PHONE_NUMBER 并返回 CONTENT
【问题讨论】:
标签: ruby-on-rails ruby metaprogramming
我有一个名为 Snippet 的模型,它包含 HTML 的 sn-ps 以推送到视图中。
模型有一个列 CODE 和另一个 CONTENT
我想在我的观点中写这样的东西并把内容拿回来
<%= raw Snippet.PHONE_NUMBER %>
在 CODE 上查找 PHONE_NUMBER 并返回 CONTENT
【问题讨论】:
标签: ruby-on-rails ruby metaprogramming
在Snippet类中添加method_missing类方法如下
# Snippet class
class << self
def method_missing(method, *args, &block)
if(snippet = Snippet.find_by_code(method.to_s))
return snippet.content
else
return super(method, *args, &block)
end
end
end
这应该可以解决问题。
但是,在相关说明中,我不确定这样做是否是最好的方法,因为您的代码依赖于数据库中的数据。明天,电话号码的记录将被删除,您的代码 Snippet.PHONE_NUMBER 将被破坏。这种方法有很多维护难题。
【讨论】:
一种更简洁的方法(可以避免元编程)会让您的视图执行以下操作:
<%= snippet :PHONE_NUMBER %>
或
<%= snippet 'PHONE_NUMBER' %>
snippet 方法在这样的辅助模块中定义:
module SnippetHelper
def snippet(code)
raw Snippet.find_by_code(code.to_s).content
end
end
并通过以下方式提供给您的所有视图:
class ApplicationController < ApplicationController::Base
helper :snippet
end
【讨论】:
或者使用委托。
但听起来您正在提供另一种部分实现,或助手,或decent_exposure 的组合以及助手和部分的某种组合。
【讨论】: