Rails 4.0 avec Devise. Attributs imbriqués Paramètres non autorisés
Je suis en train de travailler sur une application web à l'aide de Concevoir et de Rails 4. J'ai un Utilisateur modèle que j'ai prolongé avec 2 des champs de formulaires supplémentaires de sorte que lorsqu'un utilisateur s'inscrit, il peut également inscrire son nom et prénom. (basé sur http://blog.12spokes.com/web-design-development/adding-custom-fields-to-your-devise-user-model-in-rails-4/). Je veux maintenant ajouter un Institution modèle. Ce modèle has_many :les utilisateurs, et un utilisateur belongs_to :institution. Je veux être en mesure d'enregistrer les nom de l'institution sur le même formulaire, je l'enregistrement de l'utilisateur. Je sais que j'ai besoin d'un nested_attribute dans mon Institution modèle, puisque c'est la mère, qui je le montrerai dans un instant. Lorsque je tente d'inscrire l'utilisateur j'obtiens dans la console: Unpermited paramètres: les Institutions.
Mon astuce, c'est que je ne peut pas mettre à jour ma classe parent(Institution), basé sur mon enfant de classe (de l'Utilisateur). Y aurait-il une solution à cela? Ou quelqu'un a vécu quelque chose de semblable?
class Institutions < ActiveRecord::Base
has_many :users,
accepts_nested_attributes_for :users
end
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
belongs_to :institution
end
inscriptions/nouveau.html.erb Ici, j'ai l'imbriqué
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
.
.
<%= f.fields_for :institutions do |i| %>
<p><%= i.label :name %><br />
<%= i.text_field :institutions_attr %></p>
<% end %>
Basé sur le tutoriel j'ai lié plus tôt, j'ai créé un nouveau Utilisateur::ParameterSanitizer qui hérite de la Concevoir::ParameterSanitizer et remplacé le sign_up
méthode comme suit:
lib/user_sanitizer.rb
private
def sign_up
default_params.permit(:first_name, :last_name ,:email, :password, :password_confirmation, :current_password, institutions_attributes: [:id, :name])
end
Enfin, mon application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
protected
def devise_parameter_sanitizer
if resource_class == User
User::ParameterSanitizer.new(User, :user, params)
else
super
end
end
end
Merci pour la lecture!
Console params de sortie:
{"utf8"=>"✓",
"authenticity_token"=>"JKuN6K5l0iwFsj/25B7GKDj7WEHR4DO3oaVyGxGJKvU=",
"user"=>{"email"=>"[email protected]",
"first_name"=>"abc",
"last_name"=>"xyz",
"institutions"=>{"name"=>"Government"},
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]"},
"commit"=>"Sign up"}
MODIFIER
Comme suggéré, j'ai ajouté
params.require(resource_name).permit( :email, :first_name, :last_name, institution: [:name], :password, :password_confirmation ) and I get an *error syntax error, unexpected ',', expecting => ...nstitution: [:name], :password, :password_confirmation )*
MAIS, si je re-edit à
params.require(resource_name).permit( :email, :first_name, :last_name, :password, :password_confirmation, institution: [:name] )
Je n'obtiens PAS d'erreur de syntaxe, mais je reçois Unpermited paramètres: les Établissements en la Demande.
Ma conviction est que cela se passe parce que l'Utilisateur est un enfant de l'Institution. J'ai, cependant, pas été en mesure de trouver un travail autour de cela.
source d'informationauteur Claudiu S
Vous devez vous connecter pour publier un commentaire.
config/routes.rb
Créer votre propre enregistrement contrôleur comme si ... (voir la Élaborer la documentation pour les détails de l'annulation de contrôleurs ici ...) ... ce qui est plus élégant plutôt que de le faire via le
ApplicationController
app/controllers/utilisateurs/registrations_controller.rb
Remplacer la nouvelle méthode pour créer un
Profile
associés à laUser
modèle comme ci-dessous ... exécuter leconfigure_permitted_parameters
méthode avant de désinfecter les paramètres (remarque comment ajouter des paramètres imbriqués)db/migrate/xxxxxxxxxxxxxx_create_profiles.rb
C'est la migration qui génère le
Profile
modèle (note la référence àUser
) ... cet exemple de profil ne conservefullname
comme une extension de laUser
mais n'hésitez pas à ajouter que vous le souhaitez!app/models/user.rb
app/models/profil.rb
app/views/devise/registrations/new.html
Vous devez créer votre propre enregistrement contrôleur pour ce faire, voici comment:
routes.rb
Contrôleur
Vous devez remplacer
:your_fields
par les champs que vous souhaitez autoriser (désolé si je vous laisse faire, mais en fait ma réponse plus général, donc utilisable pour quelqu'un qui passerait par là)Informations supplémentaires (nested attributs + quelques tests)
Notez également que si vous utilisez de l'association et
accepts_nested_attributes_for
vous aurezparams
structuré comme cecimodel: {field, field, field, associated_model: {field, field}}
Et bien sûr, vous devez utiliser la même structure dans votre
sign_up_params
méthode. Si vous avez besoin de comprendre cela, vous pouvez modifier le contenu design_up_params
méthode comme ceci:Qui permettra à n'importe quel paramètre, puis postez votre formulaire (il doit passer ce temps) et de regarder dans votre console rails de voir la structure de
params
enfin vous pouvez configurersign_up_params
méthode correctementVérifier cela pour plus d'infos http://www.railsexperiments.com/using-strong-parameters-with-nested-forms/
Dans votre cas, vous devez utiliser:
params.require(resource_name).permit( :email, :first_name, :last_name, institutions: [:name], :password, :password_confirmation )
À l'aide de rails 5.1 et concevoir 4.4.1 suivants est le plus court et marche plutôt bien:
app/models/user.rb
app/controllers/application_controller.rb
La clé ici est que vous pouvez faire à la suite sans faire de contrôleur séparé: