Rails & Devise: ошибка двухэтапного подтверждения параметров - PullRequest
1 голос
/ 07 июля 2011

Это продолжение моих бед и драмы ...

Пробежать:

  • Я могу ввести свой адрес электронной почты, чтобы зарегистрироваться!
  • Я могу нажать на ссылку подтверждения!
  • Я перешел на нужную страницу для подтверждения:

    http://localhost:3000/user/confirmation?confirmation_token=jxOZQnyixE1PvnrptnYO

  • Вот проблема... после отправки формы я получаю следующую ошибку:

ActiveRecord::RecordNotFound in ConfirmationsController#confirm_account

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"qUk6EDoR6N+V0h5O/jLKNZtl0hiaN/g9Gd5YdI2QhIU=",
 "user"=>{"confirmation_token"=>"jxOZQnyixE1PvnrptnYO",
 "password"=>"[FILTERED]",
 "password_confirmation"=>"[FILTERED]"},
 "commit"=>"Confirm Account"}

Проблема в строке 10:

class ConfirmationsController < Devise::ConfirmationsController
  def show
    @user = User.find_by_confirmation_token(params[:confirmation_token])
    if !@user.present?
      render_with_scope :new
    end
  end

  def confirm_account
    @user = User.find(params[:user][:confirmation_token])
    if @user.update_attributes(params[:user]) and @user.password_match?
      @user = User.confirm_by_token(@user.confirmation_token)
      set_flash_message :notice, :confirmed      
      sign_in_and_redirect("user", @user)
    else
      render :action => "show"
    end
  end
end

Вот мой show.html.erb

<%= form_for(resource, :url => confirm_account_path) do |f| %>
    <%= f.label :email %>
    <%= @user.email %>
    <%= f.hidden_field :confirmation_token %>
    <%= f.label :password %>
    <%= f.password_field :password %>
    <%= f.label :password_confirmation %>
    <%= f.password_field :password_confirmation %>
    <%= f.submit 'Confirm Account' %>
    <%= link_to 'Home', root_url %>
    <%= render :partial => 'devise/shared/links' %>
<% end %>

Я плакал об этом в течение недели ... Я действительно надеюсь, что это идиотская ошибка с моей стороны (и в то же время я не понимаю't).

Я буду рад предоставить вам больше информации, если вам это нужно.Для моего удобства, не могли бы вы подробно описать свои ответы - я новичок в рельсах!

1 Ответ

1 голос
/ 07 июля 2011

Проблема, по-видимому, заключается в том, чтобы найти пользователя с помощью User.find(params[:user][:confirmation_token]).

Это связано с тем, что метод find() будет искать пользователя по ID.Использование другого метода для поиска пользователя по токену подтверждения должно вернуть нужного пользователя.В действии show вы уже использовали этот метод один раз.

Надеюсь, это последняя проблема!

...