簡體   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