Rails:编辑params哈希

时间:2015-08-12 22:18:08

标签: ruby-on-rails ruby hash

我试图弄清楚如何在控制器传递之后编辑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 

2 个答案:

答案 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