加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

而且我认为会这样做……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读