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.
ruby-on-rails
strong-parameters
nullnullnull
quelle
quelle
deep_merge
im params Konstruktor verwendet? Oder anderswo in Ihrem Controller?current_user.items.create(item_params)
. Ich benutzemerge
nur, wenn ich eine andere Assoziation zu erstellen habe, dh@comment = @commentable.comments.new(comment_params)
und meinecomment_params
Methode sieht so aus:params.require(:comment).permit(:body, :parent_id, :removed).merge(user_id: current_user.id)
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
quelle
merge!
und das ist immer noch gescheitert.deep_merge
wie in den Kommentaren der ausgewählten Antwort besprochen.Alternativ können Sie für diesen Fall das Pass-Attribut über Folgendes anfordern
scope
:current_user.posts.create(post_params)
quelle
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
quelle