2017-10-07 5 views
0

Je construis un api Rails et ont actuellement cette structure de dossier:Rails préoccupations, comment inclure une préoccupation à l'intérieur d'un contrôleur api

enter image description here

Le fichier error_serializer.rb est un module:

module ErrorSerializer 
    extend ActiveSupport::Concern 

    ...methods here... 
end 

Ce que je peux inclure dans l'un des contrôleurs de api, par exemple:

class Api::TemplatesController < ApiController 
    include ErrorSerializer 
    ... 
end 

Mais comme ce module errors_serializer ne concerne que les contrôleurs api, je veux déplacer le fichier à 'api/concerns/error_serializer.rb'.

Mais qui génère l'erreur:

ActionController::RoutingError (uninitialized constant Api::TemplatesController::ErrorSerializer) 

J'ai essayé de changer le nom dans le fichier à:

module Api::ErrorSerialzer 

mais nous avons eu la même erreur.

Alors, que dois-je changer pour pouvoir déplacer ce fichier?

+0

Avez-vous changé 'include' pour être' Api :: ErrorSerializer'? –

+0

@AndrewMarshall Oui, je l'ai fait. – rmcsharry

Répondre

3

Depuis rails attend votre module de nommage pour suivre la structure de votre dossier, votre préoccupation devrait être nommé:

module Api::Concerns::ErrorSerializer 

Puisque vous l'inclure dans Api::TemplatesController, je le ferais:

class Api::TemplatesController < ApiController 
    include Api::Concerns::ErrorSerializer 
    ... 
end 

Pour aider les rails avec la recherche constante.

0

Grâce à la réponse de @jvillian et this blog post, j'ai été capable de comprendre la façon de faire les Rails (car en fait, je vais avoir besoin de l'inquiétude dans tous les contrôleurs Api, et aussi mon contrôleur API était en dehors de l'API espace de noms). Donc je poste cette solution (je pense) c'est la façon préférée:

je me suis déplacé le fichier error_serialzier.rb dans api/préoccupations et modifier le code pour inclure l'espace de noms Api:

module Api::Concerns::ErrorSerializer 
    extend ActiveSupport::Concern 
    ... 
end 

I également déplacé fichier api_controller.rb et le mettre dans le dossier/api, et donc dans l'espace de noms de module API, alors maintenant il ressemble à ceci:

class Api::ApiController < ActionController::API 
    before_action :authenticate_api_user! 
    include DeviseTokenAuth::Concerns::SetUserByToken 
    include Concerns::ErrorSerializer 

    respond_to :json 
end 

cela se débarrasse des erreurs constantes non initialisée.