it-swarm.com.de

Rails 4: Attribute in Params einfügen

In Rails 3 war es möglich, ein Attribut wie folgt in params einzufügen:

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

Ich versuche etwas Ähnliches in Rails 4, habe aber kein Glück:

post_params[:user_id] = current_user.id

. . . .


private

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

Rails ignoriert diese Einfügung. Es wirft keine Fehler, es scheitert nur leise.

64
nullnullnull

Fand die Antwort hier . Anstatt das Attribut aus der Controller-Aktion einzufügen, können Sie es mit einem Merge in die Paramsdefinition einfügen. Um mein vorheriges Beispiel zu erweitern:

private

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

Zusätzlich zur Antwort von @ timothycommoner können Sie die Zusammenführung auch pro Aktion durchführen:

  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

In diesem Fall können Sie alternativ ein Übergabeattribut über scope anfordern:

current_user.posts.create(post_params)

3
BitOfUniverse

Wenn jemand versucht, ein verschachteltes Attribut in einem Rails 5 attribute hash) hinzuzufügen/zu bearbeiten, ist dies der einfachste (alternative) Ansatz mit merge oder deep_merge ... ist es wegen der starken Parameter schmerzhaft. In diesem Beispiel musste ich die group_id und die vendor_id vor dem Speichern auf die zugehörige Rechnung (verschachtelte Parameter) kopieren.

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.