ruby-on-rails - 设计更新密码

标签 ruby-on-rails ruby devise password-recovery

我想更改编辑密码过程。在编辑密码页面上,我有一个字段:foo,我想检查用户是否正确输入了它。

我创建了 PasswordsController 并覆盖了更新方法,我在其中添加了用于测试 :foo 是否与数据库中的相同的代码:

def update
    self.resource = resource_class.reset_password_by_token(resource_params)

    # this is code that I added
    unless self.resource.foo == params[resource_name][:foo]
      self.resource.errors.add(:foo, "Foo not correct")
    end

    if resource.errors.empty?
      resource.unlock_access! if unlockable?(resource)
      flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
      set_flash_message(:notice, flash_message) if is_navigational_format?
      sign_in(resource_name, resource)
      respond_with resource, :location => after_resetting_password_path_for(resource)
    else
      binding.pry
      respond_with resource
    end
  end

假设我在 :foo 字段中输入“test”,但在数据库中它的值为“fake”。它会在 View 上打印错误(“Foo 不正确”),但它会使用数据库中的值(“假”)而不是我输入的值(“测试”)填充 :foo 字段。

我应该重新定义reset_password_by_token或者使用我的自定义方法,但想知道是否有更优雅的方法来解决这个问题?

最佳答案

尝试使用 before_action (可能是 before_filter,具体取决于您的 Rails 版本):

class PasswordsController < ...

  before_action :check_foo, :only => :update

  ...

  private

    def check_foo
      # get resource
      # check foo
      # redirect if foo is not valid
    end

end

您也可以将其更改为仅扩展现有的 RegistrationsController。只需重新使用 update 的现有 Devise 实现,而无需重新实现它,只需在前面添加过滤器即可。

为了防止更新对象上的 :foo,过滤 params 散列,删除 :foo 字段,然后再将其传递给 reset_password_by_token.

def remove_foo(hash)
    hash.delete_if { |k, v| k == :foo }
end

...

self.resource = resource_class.reset_password_by_token(remove_foo(resource_params))

或者如果您使用的是 Rails 4, or Strong Parameters , 只是不允许它。

关于ruby-on-rails - 设计更新密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18497773/

相关文章:

ruby-on-rails - 多态关系 "undefined method ` comments' for #<Post..."错误

c++ - ruby 按引用传递与按值传递引用

ruby-on-rails - 在 Rails 中为 Twitter API 解析 JSON 的最佳方式

ruby-on-rails - 允许管理员使用 Devise 添加用户

ruby-on-rails - 集成 Rails 4、timekit api、rest-client 和 Devise

ruby-on-rails - PG运算符不存在 : uuid = text

javascript - 如何从 Rails Controller 中的 XMLHttpRequest 中提取数据

ruby-on-rails - 如何使用 Devise 在登录页面中捕获表单错误

Ruby编程练习判断一个字符串是否为回文

ruby-on-rails-3 - SSL on Devise 无法正常工作 Rails 3