2017-06-19 5 views
2

Ich aktualisiere von Rails 4 auf 4.2. Ich habe einen Benutzer-Controller, der etwa wie folgt aussieht:ArgumentError: Beim Zuweisen von Attributen müssen Sie einen Hash als Argument übergeben

user_controller.rb

class UsersController < ApplicationController 

    def new 
    end 

    def edit 
    end 

    protected 

    def create_with_token 
    @user.attributes = params[:user] 
    @user.validate_password = true 

    if @user.save 

    else 
     render 'new' 
    end 
    end 

    private 

    def user_params 
    params.require(:user).permit(
     :email, :first_name, :last_name, :password, :more_attributes 
    ) 
    end 
end 

Ich bin nicht sicher, doch wenn dies hat etwas mit strong_params zu tun. Aber soweit ich weiß params[:user] gibt einen Hash zurück. Warum bekomme ich ArgumentError: When assigning attributes, you must pass a hash as an argument. auf @user.attributes = params[:user]?

überprüfte ich die rails code und gefunden:

def assign_attributes(new_attributes) 
    if !new_attributes.respond_to?(:stringify_keys) 
    raise ArgumentError, "When assigning attributes, you must pass a hash as an argument." 
    end 
    return if new_attributes.empty? 

    attributes = new_attributes.stringify_keys 
    _assign_attributes(sanitize_for_mass_assignment(attributes)) 
end 

Von hier aus unter der Annahme #assign_attributes#attributes ersetzt (es ist eigentlich ein alias dafür entnehme ich, dass params[:user] nicht #stringify_keys reagiert Aber warum Wie Was ist..?? ? die Arbeit rund um

+1

sollten Sie 'user_params', aber ich erwartete ein' forbiddenAttributesError' –

Antwort

0

Ihre params[:user] ist eine Instanz von Actioncontroller :: Parameter, ich denke ... so einfach wechseln müssen:

@user.attributes = params[:user]

Um

@user.attributes = user_params

Verwandte Themen