web-dev-qa-db-fra.com

Rails 4: Insérer un attribut dans les paramètres

Dans Rails 3, il était possible d'insérer un attribut dans les paramètres comme ceci:

params[:post][:user_id] = current_user.id

J'essaie de faire quelque chose de similaire dans Rails 4, mais je n'ai pas de chance:

post_params[:user_id] = current_user.id

. . . .


private

  def post_params
    params.require(:post).permit(:user_id)
  end

Rails ignore cette insertion. Il ne jette aucune erreur, il échoue simplement.

64
nullnullnull

Trouvé la réponse ici . Plutôt que d'insérer l'attribut depuis l'action du contrôleur, vous pouvez l'insérer dans la définition de params avec une fusion. Pour développer mon exemple précédent:

private

  def post_params
    params.require(:post).permit(:some_attribute).merge(user_id: current_user.id)
  end
134
nullnullnull

En plus de la réponse de @ timothycommoner, vous pouvez également effectuer la fusion action par action:

  def create
    @post = Post.new(post_params.merge(user_id: current_user.id))
    # save the object etc
  end

private
  def post_params
    params.require(:post).permit(:some_attribute)
  end
36
Numbers

Comme alternative à ce cas, vous pouvez exiger un attribut pass via scope:

current_user.posts.create(post_params)

3
BitOfUniverse

Si quelqu'un essaie de comprendre comment ajouter/modifier un attribut imbriqué dans un hachage Rails 5 attributs), j'ai trouvé qu'il s'agissait de l'approche la plus directe (alternative). Ne vous embêtez pas. avec merge ou deep_merge ... c’est un problème en raison des paramètres puissants. Dans cet exemple, je devais copier les informations group_id et vendor_id dans la facture associée (paramètres imbriqués) avant la sauvegarde.

def create
  my_params = order_params
  @order = Order.new
  @order.attributes = my_params
  @order.invoice.group_id = my_params[:group_id]
  @order.invoice.vendor_id = my_params[:vendor_id]
  @order.save
end

private

# Permit like normal
def order_params
  params.require(:order).permit([:vendor_id, :group_id, :amount, :shipping,:invoice_attributes => [:invoice_number, :invoice_date, :due_date, :vendor_id, :group_id]])
end
0
Hollie B.