2017-01-10 13 views
2

Я стараюсь следовать «Новый способ вызова вспомогательных методов в Rails 5», упомянутый here, первоначально PR here.Rails 5 метод помощников уровня экземпляра в контроллере не распознает помощников. метод

я могу получить «старый подход» к работе со следующим:

# app/models/order.rb 
class Customer < ActiveRecord::Base 
    include CustomersHelper 
    # some code... 

    def name_make_uppercase 
    self.first_name = uppercase(first_name) 
    self.last_name = uppercase(last_name) 
    end 
end 

# app/helperss/customers_helper.rb 
module CustomersHelper 
    def uppercase(input) 
    return unless input 
    input[0] = input[0].to_s.capitalize 
    input 
    end 
end 

Однако, с новым подходом я считаю, что я должен быть в состоянии удалить «включить CustomersHelper» и добавить «помощник». к моим прописным функциям в контроллере, например.

# app/models/order.rb 
class Customer < ActiveRecord::Base 
    # include CustomersHelper 
    # some code... 

    def name_make_uppercase 
    self.first_name = helpers.uppercase(first_name) 
    self.last_name = helpers.uppercase(last_name) 
    end 
end 

Однако, теперь мои спецификации являются получаю следующее сообщение об ошибке:

NameError: undefined local variable or method `helpers' for #Customer:0x00000004d50be8>

Мне любопытно, что я могу делать неправильно.

ответ

4

helpers метод доступен только в контроллеров, вы пытаетесь использовать его в модели. Модели не имеют (и не должны) иметь знания о своих представлениях/контроллерах/помощниках.

Похоже, что вам нужен либо обычный модуль (т. Е. Не помощник Rails), либо, может быть, декоратор (например, draper). В любом случае метод helpers не поможет вам здесь.

1

Рекомендуется использовать ваши методы-помощники для просмотра шаблонов, а не смешивания помощников вида в классах моделей рельсов.

Вы можете просто использовать capitalize (стандартный библиотечный метод ruby ​​для класса String) к вашим атрибутам экземпляра из вашего метода экземпляра модели.

# app/models/order.rb 
class Customer < ActiveRecord::Base 

    def name_make_uppercase 
    self.first_name = first_name.capitalize 
    self.last_name = last_name.capitalize 
    end 

end 

и использовать его:

c = Customer.new(first_name: 'bruce', last_name: 'wayne') 
c.name_make_upcase 
c.first_name #=> 'Bruce' 
c.last_name #=> 'Wayne'