1. Here it is:
biske@biske:~$ ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]
biske@biske:~$ rails -v
Rails 4.0.0
biske@biske:~$ gem list devise
*** LOCAL GEMS ***
devise (3.0.3)
2. I already wrote that I want to add some fields on edit password page and want to check if they match values in database. Let's simplify this:
Scenario: Reset password
Given I am registered user
When I go to new password page
And I press "Send me reset password instructions" button
When I open email
And I press "Change my password" button
Then I should be redirected to "edit password page"
When I fill in "user_email" with "FooBar"
And I fill in "user_email_confirmation" with "FooBar"
And I fill in "user_name" with "TestTest"
And I press "Change my password" button
Then I should see "Your password was changed successfully. You are now signed in." message
3. I override PasswordsController
class PasswordsController < Devise::PasswordsController
# GET /resource/password/edit?reset_password_token=abcdef
def edit
if resource.nil?
resource.reset_password_token = params[:reset_password_token]
end
end
# PUT /resource/password
respond_with resource
end
end
end
I want to check if user answered security questions and I think reset_password_by_token should be overriden. I tried it into model:
class User < ActiveRecord::Base
.....
.....
def self.reset_password_by_token(attributes={})
original_token = attributes[:reset_password_token]
reset_password_token = Devise.token_generator.digest(self, :reset_password_token, original_token)
recoverable = find_or_initialize_with_error_by(:reset_password_token, reset_password_token)
if recoverable.persisted?
if recoverable.reset_password_period_valid?
# custom logic for checking security question
recoverable.reset_password!(attributes[:password], attributes[:password_confirmation])
else
recoverable.errors.add(:reset_password_token, :expired)
end
end
recoverable.reset_password_token = original_token
recoverable
end
end
But it raises error:
Here is github repository: