2016-06-11 1 views
5

ayant deux items_controller, une pour l'API (dans app/controllers/api /) et un pour le backend (dans app/controllers/backend)Rails/strong définition de paramètres partagés entre deux contrôleurs

Les paramètres forts sont assez longs (20 champs ou quelque chose) et incitent à évoluer un peu. Cela ne serait pas impossible de maintenir cette liste dans les deux contrôleurs, mais comme les besoins sont plus ou moins les mêmes sur les actions create/updates, je chercherais à partager la définition des paramètres forts dans un fichier séparé qui serait partagé à la fois

J'ai essayé d'hériter ces deux avec un contrôleur super incluant seulement la définition forte de paramètre:

class SharedItemsController < ApplicationController 
    private # not knowing all the prerequisites of this, I tried also using protected instead of private; same result 
    def item_params 
     .... 
    end 
    end 
end 
class Frontend::ItemsController < SharedItemsController 
    ... 
end 
class Api::ItemsController < SharedItemsController 
    ... 
end 

Aucun succès, je suis coincé avec des paramètres non permises

l'espoir d'obtenir quelques conseils sur celui-ci sur SO; mieux

+0

Que voulez-vous dire, sans succès? Aurait dû travailler. –

+0

De toute façon, l'utilisation de l'héritage pour le partage de code est une mauvaise idée. Essayez de mettre la méthode des paramètres forts dans un module et incluez-la. –

+0

@SergioTulentsev pourrait google, mais je pense que j'accepterais votre réponse si vous aviez quelques indications sur celui-ci, venant d'une source conseillée. dois dire que je ne suis pas si familier avec les modules – Ben

Répondre

5

grâce à @SergioTulentsev; dans ce cas, un modèle basique et préférable serait d'utiliser un module. Par exemple, dans lib/items_controller_params.rb:

module ItemsControllerParams 
    def item_params 
    params.require(:item).permit(
     .. your fields here ... 
    ) 
    end 
end 

Ensuite, il pourrait être inclus dans les contrôleurs concernés comme ci-dessous:

class Api::ItemsController < ApplicationController 
    include ItemsControllerParams 
    ... 
    end 
-1

Je ne vous ai pas vraiment pourquoi vous ne mettez pas

private 

def item_params 
    params.require(:item).permit(your_fields_name) 
end 

dans le contrôleur particulier? Si vous pensez que vous avez 20-30 champs et que vous ajouterez tous les champs et que vous aurez besoin d'utiliser des attributs imbriqués, cela sera encore plus compliqué. Donc main courte

private 

def item_params 
    params.require(:item).permit! 
end 

permettre avec! et c'est tout, vous n'avez plus besoin de définir chaque colonne dans params même si elle est imbriquée. Bonne chance.

+0

Avez-vous manqué le point? Il a besoin de cette méthode dans deux contrôleurs. –

+0

Je pourrais, mais comme cette partie du code va être la même presque exacte, et est déjà assez longue (je l'ai raccourci mais j'ai déjà des attributs imbriqués, donc vous pouvez doubler le nombre de champs), j'ai senti comme trouver un moyen de le partager correctement. Aller dans le permis!'-si tout se sent un peu yolo; mais je peux me tromper en pensant que pour certaines raisons – Ben

+0

@Ben: ouais, en utilisant 'permit!', ça défait un peu le point. –