我想更改编辑密码过程。在编辑密码页面上,我有一个字段: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/