2014-01-15 1 views
1

Я пытаюсь создать базовую форму, в которой пользователь может изменить свой пароль, но для этого нужно ввести свой старый пароль. У меня возникли проблемы с проверкой старого пароля пользователя. Каждый раз, когда я вводил старый пароль, он говорит, что пароль не совпадает, когда я знаю, что это так. Если заменить фактический пароль в поле authenticate, он будет работать. Как я могу внести то, что было введено в форму, чтобы проверить старый пароль, который был введен?Приведение значений формы в контроллер - Ruby on Rails

Форма:

<%= form_for(@user, :url => change_password_action_path(current_user.id), html: { "role" => "form" }) do |f| %> 
<%= render 'shared/error_messages', object: f.object %> 

<div class="form-group"> 
    <%= f.label :old_password, "Old Password:", :class => "control-label" %> 
    <%= f.password_field :old_password, :class => "form-control" %> 
</div> 

<div class="form-group"> 
    <%= f.label :password, "New Password:", :class => "control-label" %> 
    <%= f.password_field :password, :class => "form-control" %> 
</div> 

<div class="form-group"> 
    <%= f.label :password_confirmation, "Password Confirmation:", :class => "control-label" %> 
    <%= f.password_field :password_confirmation, :class => "form-control" %> 
</div> 

<%= f.submit "Update Password", class: "btn btn-large btn-primary" %> 

Контроллер

def change_password 
    @user = User.find(current_user.id) 
end 

def change_password_action 
    user = current_user.id 
    if User.find(user).authenticate(params[:old_password]) == false 
     flash[:danger] = "Password Doesnt Match: " 
    else 
     flash[:success] = "Password Match" 
      # Validate the new and confirm password. 
    end 
    redirect_to action: :change_password 
end 

Маршруты

get '/change_password' => 'main#change_password' 
patch '/change_password_action' => 'main#change_password_action' 

Rails сервера Журналы

Started PATCH "/change_password_action.1" for 127.0.0.1 at 2014-01-15 09:04:38 -0600 
Processing by MainController#change_password_action as 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"yYdUx37Q7alr3SccuMVjPwCJoMgMPOaiKTesSsILlP4=", "user"=>{"old_password"=>"[FILTERED]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Update Password"} 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'fc1baf63bac072bfefd5ed27664ece5427ad9e64' LIMIT 1 
{"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"yYdUx37Q7alr3SccuMVjPwCJoMgMPOaiKTesSsILlP4=", "user"=>{"old_password"=>"test123", "password"=>"", "password_confirmation"=>""}, "commit"=>"Update Password", "controller"=>"main", "action"=>"change_password_action", "format"=>"1"} 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
Redirected to http://localhost:3000/change_password 
Completed 302 Found in 115ms (ActiveRecord: 0.7ms) 


Started GET "/change_password" for 127.0.0.1 at 2014-01-15 09:04:39 -0600 
Processing by MainController#change_password as HTML 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'fc1baf63bac072bfefd5ed27664ece5427ad9e64' LIMIT 1 
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
Rendered shared/_error_messages.html.erb (0.1ms) 
Rendered main/change_password.html.erb within layouts/application (2.6ms) 
Rendered layouts/_header.html.erb (0.5ms) 
Rendered layouts/_footer.html.erb (0.0ms) 
Completed 200 OK in 19ms (Views: 16.2ms | ActiveRecord: 0.4ms) 
+0

место' logger.info params.inspect' перед попыткой аутентификации в контроллере. это поместит все параметры в файл журнала –

+0

Пожалуйста, покажите результаты с консоли веб-сервера при выполнении запроса. – Beartech

+0

Я добавил, что выходит из консоли. – evanvee

ответ

2

Похоже, вы передаете неправильный параметр в ваш метод AUTHENTICATE. Попробуйте использовать params [: user] [: old_password] вместо params [: old_password].

Значение параметра, которое вы хотите, будет находиться под ключом пользователя: потому что ваш form_for использует объект пользователя.

Вы также можете увидеть это в своих журналах сервера, где пользовательский параметр в хэше вашего параметра: "user" => {"old_password" => "[FILTERED]", "password" => "[FILTERED] "," password_confirmation "=>" [FILTERED] "}

+0

Это исправлено! Спасибо!! – evanvee

Смежные вопросы