2017-01-10 4 views
2

J'essaie de suivre la "Nouvelle façon d'appeler les méthodes d'assistance dans Rails 5" mentionné here, à l'origine PR here.Rails 5 méthode d'aide de niveau d'instance dans le contrôleur ne reconnaissant pas les aides. méthode

je peux obtenir la « ancienne approche » de travailler avec les éléments suivants:

# 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 

Cependant, avec la nouvelle approche que je crois que je devrais être en mesure d'enlever le « inclure CustomersHelper » et ajouter « aides. » à mes fonctions majuscules dans le contrôleur par ex.

# 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 

Cependant, maintenant mes spécifications de obtiennent l'erreur suivante:

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

Je suis curieux de savoir ce que je pourrais faire mal.

Répondre

4

La méthode helpers est seulement disponible en contrôleurs, vous essayez de l'utiliser dans un modèle . Les modèles n'ont pas (et ne devraient pas) avoir des connaissances sur leurs vues/contrôleurs/aides.

Il semble que ce dont vous avez besoin soit un module régulier (pas un assistant Rails) ou peut-être un décorateur (par exemple draper) Dans tous les cas, la méthode helpers ne vous aidera pas ici.

1

Il est recommandé de limiter vos méthodes d'assistance à l'affichage des modèles et de ne pas mélanger les aides de vue dans les classes de modèles de rails.

Vous pouvez simplement utiliser capitalize (méthode de bibliothèque standard ruby ​​pour la classe String) pour vos attributs d'instance à partir de votre méthode d'instance de modèle.

# 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 

et de l'utiliser:

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