Rails:创建所有视图和所有模型中可用的方法

时间:2010-03-18 01:00:46

标签: ruby-on-rails

我想定义一个可用于视图和我的模型

的方法

说我有一个助手:

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

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

我不知道解决这个问题的最佳方法,但我不想在这里完全反对最佳做法。

如果你能想到更好的方法,我很想学习!

2 个答案:

答案 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上的三元运营商?处理模型没有名称列的情况。