我有一个用户模型
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
答案 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