2016-10-03 8 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

最初に ':name'を' new/create'で作成できるようにしたいのですが、その後で ':name'を' '更新/編集 'できないようにしたいと思います。 –

+0

入手しました。ただ私の答えを更新しました。 –

+0

ありがとうございます。質問にリンクされている '.except'がまだRails 4で動作するかどうかは誰にも分かりますか? –

関連する問題