2015-04-19 1 views
1

Je suis confronté au problème suivant: dans mon application, j'utilise des moteurs. Disons que j'ai un moteur de magasin. Dans ce moteur de magasin j'ai deux contrôleurs: carts_controller et products_controller et leurs aides: carts_helper et products_helper.Erreur de méthode non définie pour la méthode d'assistance sur la vue dans les rails Moteur

Maintenant sur ma vue views/shop/products/index.html.erb, j'essaie d'appeler la méthode cart_action qui est définie dans helpers/shop/carts_helper.rb. Cependant, malheureusement, je reçois un undefined method `cart_action' for #<#<Class:0x007fb3627af090>:0x007fb3627aab08> quand je fais cela. Lorsque je place la même méthode dans helpers/shop/products_helper.rb je ne reçois pas ce message et la méthode fonctionne bien .... Pourquoi ne puis-je pas utiliser la méthode de carts_helper, mais puis-je utiliser la méthode de products_helper? Dans une application de rails normale, je peux utiliser n'importe quelle méthode d'assistance sur n'importe quelle vue, non?

Il pourrait devoir faire quelque chose avec l'espace de nommage-à-dire les fichiers d'aide ne sont pas en helpers mais helpers/shop cependant this helps prevent conflicts with helpers from other engines or apps...

module Shop 
    module CartsHelper 
     def cart_action(package_id) 
     #some code 
     end 
    end 
end 

Comment je l'appelle sur shop/products/index.html.erb:

<%= cart_action(package['id']) %> 

Aurait-il à faire avec le fait que j'hérite des fonctionnalités pour mes applications_controller de mon application principale ?:

class Shop::ApplicationController < ApplicationController 
end 

au lieu de

module Shop 
    class ApplicationController < ActionController::Base 
    end 
end 

FWIW mes itinéraires pour ce moteur ressemble à:

Shop::Engine.routes.draw do 
    resources :products, only: [:index] 
    # shopping cart 
    resource :cart, only: [:show] do 
     put 'add/:package_id', to: 'carts#add', as: :add_to 
     put 'remove/:package_id', to: 'carts#remove', as: :remove_from 
    end 

end 

Merci pour toute aide à l'avance!

Remarque: Je ne souhaite pas utiliser ma méthode d'assistance dans mon application principale, mais uniquement sur une autre vue du même moteur.

Répondre

3

En plus de ApplicationHelper, seules les aides spécifiques à la vue sont accessibles à la vue. Comme il s'agit de votre vue liée au produit, seuls les outils ApplicationHelper + ProductsHelper sont accessibles. La solution consiste donc à déplacer cette méthode vers ProductsHelper ou vers ApplicationHelper.

+0

Merci @MarcusTres, appris quelque chose de nouveau aujourd'hui :) J'ai trouvé deux autres options qui fonctionnent pour moi aussi, voir [ma réponse] (http://stackoverflow.com/a/29734454/3519981). – PSR

1

j'ai trouvé deux façons de rendre les méthodes disponibles pour d'autres vues ainsi:

En créant un initialiseur dans mon dossier /my_engine/lib/my_engine/engine.rb comme décrit ici: https://stackoverflow.com/a/9641149/3519981

Ou en incluant helper :all dans mon dossier controllers/myengine/application_controller.rb comme décrit ici: https://stackoverflow.com/a/1179900/3519981

Notez que tous les assistants seront également disponibles dans l'application principale. Pour moi ce n'est pas un problème (pour le moment).