Schienen 4: Attribut in Parameter einfügen

68

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

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

Ich versuche in Rails 4 etwas Ähnliches zu tun, 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 schlägt nur leise fehl.

nullnullnull
quelle

Antworten:

143

Können Sie die Antwort hier . Anstatt das Attribut innerhalb der Controller-Aktion einzufügen, können Sie es mit einer Zusammenführung in die Parameterdefinition 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
nullnullnull
quelle
@marflar hast du deep_mergeim params Konstruktor verwendet? Oder anderswo in Ihrem Controller?
Brian Jordan
So mache ich es auch, aber ich denke immer wieder, dass es einen Weg geben muss, dies ein bisschen zu trocknen. Alle meine über 50 Controller haben eine ähnliche .merge-Anweisung im Bereich der strengen Parameter. In meinem Fall füge ich den current_user in update_by zusammen. Ich füge current_user nur in der create-Methode in created_by zusammen.
Dan
@ Dan, ich denke du verwendest Assoziationen, also sollte es einfacher sein, so etwas zu verwenden wie : current_user.items.create(item_params). Ich benutze mergenur, wenn ich eine andere Assoziation zu erstellen habe, dh @comment = @commentable.comments.new(comment_params)und meine comment_paramsMethode sieht so aus:params.require(:comment).permit(:body, :parent_id, :removed).merge(user_id: current_user.id)
Almir Sarajčić
Leute, bitte schaut euch meine Frage an und hilft mir, wenn ihr könnt. Es hängt
Sean Magyar
Wenn Sie wie ich nach einem benutzerdefinierten Wert in params gesucht haben, können Sie `params.require (: post) .permit (: some_attribute) .merge (user_id: params [: post] [: id])`
eXa
39

Zusätzlich zur Antwort von @ timothycommoner können Sie die Zusammenführung alternativ 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
Fremder
quelle
2
Hey, wie würden Sie das für eine verschachtelte Ressource tun?
Mene
Ich bin mir nicht sicher warum, aber die Antwort von @ timothycommoner funktioniert bei mir nicht. nur dieser tut es ... ich habe es sogar versucht merge!und das ist immer noch gescheitert.
na ja,
@ Patient55 Ich denke, Sie brauchen, deep_mergewie in den Kommentaren der ausgewählten Antwort besprochen.
Wit
3

Alternativ können Sie für diesen Fall das Pass-Attribut über Folgendes anfordern scope:

current_user.posts.create(post_params)

BitOfUniverse
quelle
0

Wenn jemand versucht, herauszufinden, wie ein verschachteltes Attribut in einem Rails 5-Attribut-Hash hinzugefügt / bearbeitet wird, ist dies der einfachste (alternative) Ansatz. Kümmere dich nicht um Merge oder Deep_merge ... es ist ein Schmerz aufgrund der starken Parameter. 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
Hollie B.
quelle