我覆盖了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。
答案 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
但我不认为这是处理这个问题的最好方法。我希望有更好的答案。