私のRoRアプリケーションではdeviseを使用しており、クライアントは少しカスタマイズする必要があります. これを処理するカスタム アクション、つまりユーザー コントローラーで独自の change_password アクションを設定しました。
Users Controller Actions
def change_password
@user = User.find(params[:id])
end
def update_password # I post to this
@user = User.find(params[:id])
if @user.update_attributes!(params[:user])
redirect_to users_path, :notice => "User updated."
else
redirect_to users_path, :alert => "Unable to update user."
end
end
ここに routes.rb エントリがあります
devise_for :users, :skip => [:registrations]
as :user do
get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
put 'users' => 'devise/registrations#update', :as => 'user_registration'
end
resources :users
...
match "/users/:id/change_password" =>"users#change_password", :as=>:change_password_user, :via=>:get
match "/users/:id/update_password" => "users#update_password", :as=>:update_password_user, :via=>:post
そして、これは私のユーザーモデルです
class User < ActiveRecord::Base
rolify
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable, :registerable,
devise :database_authenticatable, #:registerable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :role_ids, :as => :admin
attr_protected :username, :name, :email, :password, :password_confirmation, :remember_me
validates_uniqueness_of :username
validates_presence_of :username, :email
validates_uniqueness_of :email
end
ただし、この質量属性割り当てエラーが引き続き発生します
Can't mass-assign protected attributes: password, password_confirmation
奇妙なことは、これらの属性をすべてaccessible_protectedに設定したことです。他のユーザーの詳細を編集できますが、パスワードを編集できません。何が起きてる?