2016-10-03 78 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? –