繁体   English   中英

如何在rails 4.2中扩展模型

[英]How to extend model in rails 4.2

我有一个用户模型

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

这两个代码都在同一个文件中。 ie app/models/User.rb但我想将module UserBusinessEntity代码移动到app/services/

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

我相信你可以使用greeting在视图或邮件中呈现。 所以这是使用演示者的展示。 这里有一篇文章

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

应用程序/主持人/ 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>

而且,人们可能会用关注来实现这一点,但对我来说这不是一个好习惯!

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

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

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

class User
  include Foo
  # ...
end

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

@user = User.new
@user.greeting

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM