说我有一个助手:
def foo(s)
"hello #{s}"
end
视图可能会使用这样的帮助程序:
<div class="data"><%= foo(@user.name) %></div>
但是,此<div>
将通过重复的ajax调用进行更新。我在控制器中使用to_json
调用返回如下数据:
render :text => @item.to_json(:only => [...], :methods => [:foo])
这意味着,我必须在foo
模型中定义Item
:
class Item
def foo
"hello #{name}"
end
end
如果我能够在 我的观点和模型中共享 DRY 方法,那就太好了。
def say_hello(s)
"hello #{s}"
end
def foo
say_hello(name)
end
def foo
say_hello(label)
end
<div class="data"><%= item.foo %></div>
def observe
@items = item.find(...)
render :text => @items.to_json(:only=>[...], :methods=>[:foo])
end
我不知道解决这个问题的最佳方法,但我不想在这里完全反对最佳做法。
如果你能想到更好的方法,我很想学习!
答案 0 :(得分:5)
您可以添加一些模块,然后在模型中使用您希望方法(在特定属性上)的工作:
模块(将其添加到lib文件夹)
module hasFoo
def self.included(base)
base.extend ClassMethods
end
end
module ClassMethods
def has_foo(method)
define_method foo do
field = self.send(method.to_sym)
field
end
end
end
然后在你的模型中,添加
has_foo :name
然后你可以调用model.foo
而且我认为会这样做......
答案 1 :(得分:1)
我只是将此方法放在我的模型中,该模型可供视图和控制器使用。
型号:
def say_hello
"hello #{self.name}"
end
要将其添加到所有模型中:
class AbstractModel < ActiveRecord::Base
self.abstract_class = true
def say_hello
self.respond_to?(:name) ? "hello #{self.name}" : "hello"
end
end
class MyModel < AbstractModel
end
respond_to上的三元运营商?处理模型没有名称列的情况。