2016-05-11 2 views
1

У меня есть модель пользователяКак продлить модель в рельсах 4,2

class User 

def fname 
    @fname 
end 

def fname=(str) 
    @fname = str 
end 

def greeting 
    "Hello #{@fname}" 
end 

end 

Но я хочу, чтобы удалить метод greeting где-то еще, так что моя модель пользователя не включают в себя бизнес-логику. Как я мог это достичь? Я пытаюсь создать модуль (foo.rb) в lib, но его не работает. Должен ли я включать в модель пользователя?

Обновлено Информация: Я обновил свой код

  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 UserBusinessEntity но его дает uninitialized constant UserBusinessEntity

+0

Зачем включать Ube? Должно быть включено UserBusinessEntity –

+0

Его 'UserBusinessEntity'. Извините за опечатку. Но проблема все еще существует. Если я помещаю 'UserBusinessEntity' в какую-то другую папку, он дает ошибку – iamkdev

+0

Вы пытались перезагрузить приложение? –

ответ

1

Просто создать модуль вроде этого:

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

Затем включите модуль в модуле пользователя:

class User 
    include Foo 
    # ... 
end 

Тогда вы можете позвонить в контроллер или вид

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

Я создаю модуль в lib как 'foo.rb' и включить в мои 'models/users.rb' И в контроллере пользователей я назвал' render plain: User.new.foo' Я получаю 'NameError' – iamkdev

+0

Foo - это модуль, а не атрибут/метод, см. мой обновленный ответ –

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, чтобы реализовать это, но со мной это не очень хорошая практика!

Смежные вопросы