1

关于在 RegistrationController 中添加 :current_password 属性是否正确的问题?

用户模型include ActiveModel::ForbiddenAttributesProtection

# app/model/user.rb

class User < ActiveRecord::Base
include ActiveModel::ForbiddenAttributesProtection

继承自 Devise 的密码控制器的密码控制器

# app/controllers/users/passwords_controller.rb

class Users::PasswordsController < Devise::PasswordsController
  def resource_params
    params.require(:user).permit(:email, :password, :password_confirmation)
  end
  private :resource_params
end

继承自 Devise 的注册控制器的注册控制器

# app/controllers/users/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController
  def resource_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation, :current_password)
  end
  private :resource_params
end

路由设计使用指定用户的密码和注册控制器。

# config/routes.rb

devise_for :users, :controllers => {:registrations => "users/registrations", :passwords => "users/passwords"}

RegistrationsController我必须为用户添加属性:current_password才能编辑他们的个人资料。

我问的原因是没有strong_parameters我只会指定一个attr_accessiblefor :email, :password, :password_confirmation, :remember_me

非常感谢任何见解。

4

1 回答 1

2

我相信你的方法是正确的。至少看起来其他人也在使用它。

https://gist.github.com/kazpsp/3350730/#comment-833882 https://gist.github.com/bluemont/e304e65e7e15d77d3cb9

我怀疑您已经遇到过这个问题,但我想我会为将来可能会发现这个问题的其他人回答。

编辑:由于问题(和我的答案)专门针对在控制器级别与模型添加 :current_password 的适当性(不确定您甚至会如何做后者),所以我的答案的原始部分仍然有效。但是,似乎最新的 Devise 模组(至少从 3.0.0.rc 开始)已经消除了覆盖 resource_params 的能力,转而将该方法拆分为几个更具体的方法,如 sign_up_params、create_account_params 等以获得更好的效果粒度控制。虽然我确实让我的应用程序单独覆盖这些新方法,但似乎在设计自述文件中描述并在此处引用的“before_filter”(rails 4 中的before_action)方法是首选方式,并且可能也更易于维护。

于 2013-07-08T03:29:50.463 回答