Rails 4: Insérer Un Attribut Dans Params
Dans Rails 3, il a été possible d'insérer un attribut dans les params de la sorte:
params[:post][:user_id] = current_user.id
Je suis d'essayer de faire quelque chose de similaire dans les Rails 4, mais n'ayant aucune chance:
post_params[:user_id] = current_user.id
. . . .
private
def post_params
params.require(:post).permit(:user_id)
end
Rails ignorant de cette insertion. Il ne jette pas des erreurs, c'est juste échoue silencieusement.
Vous devez vous connecter pour publier un commentaire.
Trouvé la réponse ici. Plutôt que d'insérer l'attribut à partir de l'action du contrôleur, vous pouvez l'insérer dans les paramètres de définition d'une fusion. Pour élargir mon exemple précédent:
deep_merge
dans les params du constructeur? Ou ailleurs dans votre contrôleur?current_user.items.create(item_params)
. J'utilisemerge
seulement quand j'ai une autre association à créer, c'est à dire@comment = @commentable.comments.new(comment_params)
et moncomment_params
méthode ressemble à ceci:params.require(:comment).permit(:body, :parent_id, :removed).merge(user_id: current_user.id)
En plus de @timothycommoner réponse, vous pouvez également effectuer la fusion par action de base:
merge!
et qui n'a toujours pas. oh, eh bien, ce lit est plus facile car de toute façon il n'y a pas à creuser dans les méthodes privées et il est plus facile de changer dans les différents cas d'utilisationdeep_merge
comme ils ont discuté de la réponse sélectionnée commentaires.Comme une alternative dans ce cas, vous pouvez requise attribut de passe via
scope
:current_user.posts.create(post_params)
Si quelqu'un est d'essayer de comprendre comment ajouter/modifier un imbriqués l'attribut dans un Rails de 5 attributs de hachage, j'ai trouvé ceci pour être la plus straight-forward (suppléant) approche. Ne vous embêtez pas avec de fusion ou deep_merge...c'est une douleur en raison de la forte paramètres. Dans cet exemple, j'avais besoin de copier le group_id et vendor_id de la facture (nested paramètres) avant de l'enregistrer.