我试图弄清楚如何在控制器传递之后编辑params散列。我的哈希设置如下:
def user_params
params.require(:user).permit(:username, :password, :password_confirmation, :user_type_id)
end
我有这个方法来编辑哈希
def alter_user_params_when_not_admin(user_params)
if(@logged_in_user)
if(!@logged_in_user.is_admin)
user_params[:user][:user_type_id] = 1
end
else
user_params[:user][:user_type_id]=1
end
user_params
end
我这样称呼这个方法:
def update
new_user_params = alter_user_params_when_not_admin(user_params)
respond_to do |format|
if @user.update(new_user_params)
但是在alter_user_params...
方法的第四行,我收到了这个错误:
undefined method `[]=' for nil:NilClass
答案 0 :(得分:1)
user_params
为您提供params[:user]
提供的相同功能,但具有强大的参数过滤功能。因此,当您使用user_params
时,您无需通过[:user]
,只需直接致电user_params[:user_type_id]
。
我建议使用以下代码:
def alter_user_params_when_not_admin(user_params)
if(@logged_in_user)
if(!@logged_in_user.is_admin)
params[:user][:user_type_id] = 1
end
else
params[:user][:user_type_id] = 1
end
user_params
end
更新:
我们无需在您的自定义方法中传递并返回user_params
:
def alter_user_params_when_not_admin
if(@logged_in_user)
if(!@logged_in_user.is_admin)
params[:user][:user_type_id] = 1
end
else
params[:user][:user_type_id] = 1
end
end
和
def update
alter_user_params_when_not_admin
respond_to do |format|
if @user.update(user_params)
答案 1 :(得分:0)
该错误的原因是:
`user_params[:user]` is `nil` there!
permit
返回包含其中键的新哈希,因此您必须保存对user_params
返回的哈希的引用,然后对其进行修改。
这应该有效:
def alter_user_params_when_not_admin(user_params)
#getting the current user_params in another hash
modified_user_params = user_params
if(@logged_in_user)
if(!@logged_in_user.is_admin)
#modify the hash
modified_user_params[:user_type_id] = 1
end
else
#modify the hash
modified_user_params[:user_type_id] = 1
end
#return the modified user_params hash
modified_user_params
end