2016-10-03 77 views
0

我不想让用户更新他们的:name。我发现这个question for Rails version 3但答案不适合我。我正在使用Rails 4.我可能只是有错误的语法。我无法获得@user.update_attributes(params[:user])的工作。只有:@user.update_attributes(user_params)。我的编辑表单中没有包含:name,但我的理解(??)是,用户仍然可以通过浏览器自行传递它,并使用当前代码,他们可以更改:name限制哪些用户属性可以更新

class UsersController < ApplicationController 

def edit 
    @user = User.find(params[:id]) 
end 

def update 
    @user = User.find(params[:id]) 
    @user.update_attributes(user_params) 
    if @user.save 
     flash[:success] = "Profile updated" 
     redirect_to @user 
    else 
     flash[:danger] = "Profile update Unsuccessful" 
     redirect_to 'edit' 
    end 
end 

private 

def user_params 
    params.require(:user).permit(:name, :email, :email_confirmation, :password, :password_confirmation) 
end 

回答

2

确保用户不会篡改业务规则的方法有多种。 由于您已经在使用Rails 4,因此可以利用强参数来拒绝对:name属性的访问。

您可以为每个控制器动作不同的规则集:

def create_user_params 
    params.require(:user).permit(:name,:email, :email_confirmation, :password, :password_confirmation) 
end 

def update_user_params 
    params.require(:user).permit(:email, :email_confirmation, :password, :password_confirmation) 
end 

@user.create(create_user_params) 
@user.update_attributes(update_user_params) 

枯竭:

def allowed_update_attrs 
[:email, :email_confirmation, :password, :password_confirmation] 
end 

def allowed_create_attrs 
allowed_update_attrs + [:name] 
end 

def user_params 
    params.require(:user) 
end 

@user.create user_params.permit(*allowed_create_attrs) 
@user.update_attributes user_params.permit(*allowed_update_attrs) 

有完成同样的事情,就像攻到已经允许的属性的其他方式,但这种方式似乎更简单。

+0

我希望他们能够用'new/create'创建':name' ...我只是不希望他们能够'更新/编辑'他们的':name'后面。 –

+0

明白了。刚刚更新了我的答案。 –

+0

感谢此工作正常。有没有人知道如果'.except'链接到问题仍然适用于Rails 4? –