如何在rails 4.2中扩展模型

时间:2016-05-11 07:55:30

标签: ruby-on-rails ruby-on-rails-4

我有一个用户模型

class User

 def fname
    @fname
 end

 def fname=(str)
    @fname = str
 end

 def greeting
    "Hello #{@fname}"
 end

end

但我想将greeting方法移到其他地方,以便我的用户模型不包含业务逻辑。 我该怎么做到这一点? 我尝试在lib中创建一个模块(foo.rb),但它不起作用。我应该包含在用户模型中吗?

更新信息 我更新了我的代码

            module UserBusinessEntity
              def speak(sound)
                return "#{sound} is its sound"
              end

              def greeting
                "#{self.id} Hello, #{self.fname} #{self.lname} you are #{self.age} years old"
              end
            end


            class User < ActiveRecord::Base
                include UserBusinessEntity
            end

如果两个代码位于同一个文件中,则此方法有效。i.e. app/models/User.rb 但我想将module UserBusinessEntity代码移至app/services/

我是否必须在用户模型中添加require。如果是这样,我添加了像require UserBusinessEntity但它的uninitialized constant UserBusinessEntity

2 个答案:

答案 0 :(得分:2)

我相信您可以使用greeting在视图或邮件中呈现。所以这是使用演示者的展示。好article就在这里。

基本上,定义演示者将是:

应用/主持人/ user_presenter.rb

class UserPresenter < DelegateClass(User)
  def greeting
    "Hello #{fname}"
  end
end

有很多方法可以定义,上面只是基本的,详见上文。

然后,您可以在任何地方使用它:

@user = User.first
UserPresenter.new(user).greeting

甚至在视图中

<强> example.html.erb

<p><%= UserPresenter.new(user).greeting %><p>

此外,人们可能会使用concern来实现这一点,但对我来说这不是一个好习惯!

答案 1 :(得分:1)

只需创建一个这样的模块:

module Foo
  def greeting
    "Hello #{self.fname}"
  end
end

然后在用户模块中包含该模块:

class User
  include Foo
  # ...
end

然后你可以在控制器或视图中调用

@user = User.new
@user.greeting