ruby-on-rails – Rails:创建所有视图和所有模型中可用的方法
发布时间:2020-12-17 02:58:27 所属栏目:百科 来源:网络整理
导读:我想定义一个在我的视图和模型中都可用的方法 说我有一个助手: def foo(s) "hello #{s}"end 视图可能会使用这样的帮助: div class="data"%= foo(@user.name) %/div 但是,这个 div将通过重复的ajax调用进行更新.我在控制器中使用to_json调用返回如下数据:
我想定义一个在我的视图和模型中都可用的方法
说我有一个助手: 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]) 这意味着,我必须在我的Item模型中定义foo: class Item def foo "hello #{name}" end end 如果我能有一个可以在我的视图和模型中共享的DRY方法,那就太好了. 用法可能如下所示: 帮手 def say_hello(s) "hello #{s}" end User.rb模型 def foo say_hello(name) end Item.rb模型 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 我不知道处理这个的最佳方法,但我不想完全违背最佳做法. 如果你能想到一个更好的方法,我渴望学习! 解决方法
您可以添加一些模块,然后在您希望方法工作的模型中(在特定属性上)具有以下内容:
模块(将其添加到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 而且我认为会这样做…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |