2016-05-11 8 views
1

Ich habe ein BenutzermodellWie Modell erweitern in Schienen 4.2

class User 

def fname 
    @fname 
end 

def fname=(str) 
    @fname = str 
end 

def greeting 
    "Hello #{@fname}" 
end 

end 

Aber ich mag woanders die greeting Methode entfernen, so dass mein Benutzermodell der Geschäftslogik nicht beinhalten. Wie soll ich das erreichen? Ich versuche, ein Modul (foo.rb) in der Bibliothek zu erstellen, aber es funktioniert nicht. Sollte ich in das Benutzermodell aufnehmen?

Info aktualisiert: ich meinen Code aktualisiert

  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 

Dies funktioniert, wenn beide Code in derselben Datei. i.e. app/models/User.rb Aber ich will die module UserBusinessEntity Code app/services/

bewegen Muss ich erfordern Modell auf Benutzer hinzufügen. Wenn so habe ich wie require UserBusinessEntity Aber Sein gibt uninitialized constant UserBusinessEntity

+0

Warum Ube? Sollte UserBusinessEntity enthalten –

+0

Es ist 'UserBusinessEntity'. Entschuldigung für den Tippfehler. Aber das Problem existiert immer noch. Wenn ich die 'UserBusinessEntity' in einen anderen Ordner lege gibt es einen Fehler – iamkdev

+0

Haben Sie versucht, die App neu zu laden? –

Antwort

1

einfach ein Modul wie folgt erstellen:

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

Dann schließen Sie das Modul in Ihrem Benutzer-Modul:

class User 
    include Foo 
    # ... 
end 

Dann können Sie in einem Aufruf Controller oder eine Ansicht

@user = User.new 
@user.greeting 
+0

Ich erstelle das Modul in lib als 'foo.rb' und in meine 'models/users.rb' einbinden. Und beim user controller rief ich' render plain: User.new.foo' Ich bekomme 'NameError' – iamkdev

+0

Foo ist ein Modul, kein Attribut/Methode, siehe meine aktualisierte Antwort –

2

Ich glaube, Sie könnenverwendenin Ansichten oder Mailer rendern. Dies ist also ein Schaufenster der Verwendung von Presenter. Eine gute article ist hier.

Grundsätzlich wird ein Moderator zu definieren sein:

app/Moderatoren/user_presenter.rb

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

Es gibt viele Möglichkeiten zu definieren, die oben nur basisch ist, für obige Artikel überprüfen Detail.

Dann können Sie es überall benutzen Sie wollen:

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

Oder auch in einer Ansicht

example.html.erb

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

Darüber hinaus können Menschen nutzen concern um dies zu implementieren, aber bei mir ist das keine gute Praxis!

Verwandte Themen