发送重置密码指令时设计 - ActiveModel :: ForbiddenAttributesError

时间:2014-11-02 01:40:24

标签: ruby-on-rails activerecord ruby-on-rails-4 devise

我覆盖了find_first_by_auth_conditions方法来搜索wiki提供的电子邮件或用户名:

def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first
    else
      where(conditions).first
    end
  end

但是当我尝试重置密码时,我得到了:

ActiveModel::ForbiddenAttributesError

在这一行:

where(conditions).first

我在我的Application_controller中使用了devise_parameter_sanitizer:

def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :username, :password_confirmation}
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :password, :login, :remember_me) }
  end

我正在使用Devise 3.4.1和Rails 4.1.7。

4 个答案:

答案 0 :(得分:4)

  def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      where(conditions).where(["lower(inn) = :value OR lower(email) = :value", { :value => login.downcase }]).first
    else
      conditions.permit! if conditions.class.to_s == "ActionController::Parameters"
      where(conditions).first
    end
  end

答案 1 :(得分:2)

您需要更新configure_permitted_parameters

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation, :remember_me) }
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :username, :email, :password, :remember_me) }
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :password_confirmation, :current_password) }
  end

并确保用户模型具有:

attr_accessor :login

答案 2 :(得分:2)

我今天遇到了同样的问题。所以我用Google搜索并最终找到了解决方案:

这个想法是“Do not pass down 'ActionController::Parameters' to outside the controller

我确定您的self.find_first_by_auth_conditions代码来自here。但似乎在strong_parameters gem upgrade之后。它打破了这个示例代码......在dup方法的结果是一个新的哈希之前。但目前它仍然是参数的实例

我使用的解决方案是to_h或允许!你的params在这种方法。 conditions = warden_conditions.dup.permit!

答案 3 :(得分:0)

我不得不重写Devise :: PasswordsController并添加许可证! resource_params的关键字:

   def create
        self.resource = resource_class.send_reset_password_instructions(resource_params.permit!)
        yield resource if block_given?

        if successfully_sent?(resource)
          respond_with({}, location: after_sending_reset_password_instructions_path_for(resource_name))
        else
          respond_with(resource)
        end
    end

但我不认为这是处理这个问题的最好方法。我希望有更好的答案。