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

Я пытаюсь сделать двухэтапное подтверждение, как герою, используя Devise.

Мои маршруты:

  devise_for :user, :controllers => {:confirmations => "confirmations", :registrations => "registrations" }
    put "confirm_account", :to => "confirmations#confirm_account"

Вот мой альтернативный контроллер подтверждения:

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

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

end

Вот мой show.html.erb:

<%= form_for(resource, :as => resource_name, :url => confirm_account_path(resource_name)) do |f| %>
    <%= f.label :email %>
    <%= @account.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 %>

Когда я нажимаю confirm после заполнения пароля (после нажатия подтверждения в письме с подтверждением).Я направлен на /confirm_account.user Это довольно странно, верно?Что вызывает эту проблему?

Редактировать

rake routes Возвращает:

        new_user_session GET    /user/sign_in(.:format)                   {:action=>"new", :controller=>"devise/sessions"}
            user_session POST   /user/sign_in(.:format)                   {:action=>"create", :controller=>"devise/sessions"}
    destroy_user_session GET    /user/sign_out(.:format)                  {:action=>"destroy", :controller=>"devise/sessions"}
           user_password POST   /user/password(.:format)                  {:action=>"create", :controller=>"devise/passwords"}
       new_user_password GET    /user/password/new(.:format)              {:action=>"new", :controller=>"devise/passwords"}
      edit_user_password GET    /user/password/edit(.:format)             {:action=>"edit", :controller=>"devise/passwords"}
                         PUT    /user/password(.:format)                  {:action=>"update", :controller=>"devise/passwords"}
cancel_user_registration GET    /user/cancel(.:format)                    {:action=>"cancel", :controller=>"registrations"}
       user_registration POST   /user(.:format)                           {:action=>"create", :controller=>"registrations"}
   new_user_registration GET    /user/sign_up(.:format)                   {:action=>"new", :controller=>"registrations"}
  edit_user_registration GET    /user/edit(.:format)                      {:action=>"edit", :controller=>"registrations"}
                         PUT    /user(.:format)                           {:action=>"update", :controller=>"registrations"}
                         DELETE /user(.:format)                           {:action=>"destroy", :controller=>"registrations"}
       user_confirmation POST   /user/confirmation(.:format)              {:action=>"create", :controller=>"confirmations"}
   new_user_confirmation GET    /user/confirmation/new(.:format)          {:action=>"new", :controller=>"confirmations"}
                         GET    /user/confirmation(.:format)              {:action=>"show", :controller=>"confirmations"}
             user_unlock POST   /user/unlock(.:format)                    {:action=>"create", :controller=>"devise/unlocks"}
         new_user_unlock GET    /user/unlock/new(.:format)                {:action=>"new", :controller=>"devise/unlocks"}
                         GET    /user/unlock(.:format)                    {:action=>"show", :controller=>"devise/unlocks"}
         confirm_account PUT    /confirm_account(.:format)                {:action=>"confirm_account", :controller=>"confirmations"}
        editreject_admin GET    /admin/:id/editreject(.:format)           {:action=>"editreject", :controller=>"admin"}
            reject_admin GET    /admin/:id/reject(.:format)               {:action=>"reject", :controller=>"admin"}
            accept_admin GET    /admin/:id/accept(.:format)               {:action=>"accept", :controller=>"admin"}
     entries_admin_index GET    /admin/entries(.:format)                  {:action=>"entries", :controller=>"admin"}
 preferences_admin_index GET    /admin/preferences(.:format)              {:action=>"preferences", :controller=>"admin"}
             admin_index GET    /admin(.:format)                          {:action=>"index", :controller=>"admin"}
           about_entries GET    /entries/about(.:format)                  {:action=>"about", :controller=>"entries"}
             all_entries GET    /entries/all(.:format)                    {:action=>"all", :controller=>"entries"}
       myentries_entries GET    /entries/myentries(.:format)              {:action=>"myentries", :controller=>"entries"}
              rate_entry GET    /entries/:id/rate(.:format)               {:action=>"rate", :controller=>"entries"}
            submit_entry PUT    /entries/:id/submit(.:format)             {:action=>"submit", :controller=>"entries"}
          entry_comments POST   /entries/:entry_id/comments(.:format)     {:action=>"create", :controller=>"comments"}
           entry_comment DELETE /entries/:entry_id/comments/:id(.:format) {:action=>"destroy", :controller=>"comments"}
                 entries GET    /entries(.:format)                        {:action=>"index", :controller=>"entries"}
                         POST   /entries(.:format)                        {:action=>"create", :controller=>"entries"}
               new_entry GET    /entries/new(.:format)                    {:action=>"new", :controller=>"entries"}
              edit_entry GET    /entries/:id/edit(.:format)               {:action=>"edit", :controller=>"entries"}
                   entry GET    /entries/:id(.:format)                    {:action=>"show", :controller=>"entries"}
                         PUT    /entries/:id(.:format)                    {:action=>"update", :controller=>"entries"}
                         DELETE /entries/:id(.:format)                    {:action=>"destroy", :controller=>"entries"}
                                /auth/:service/callback(.:format)         {:controller=>"services", :action=>"create"}
                services GET    /services(.:format)                       {:action=>"index", :controller=>"services"}
                         POST   /services(.:format)                       {:action=>"create", :controller=>"services"}
                    root        /(.:format)                               {:controller=>"entries", :action=>"index"}
                 offline        /offline(.:format)                        {:controller=>"application", :action=>"offline"}

Редактировать 3 Визменение

  devise_for :user, :controllers => {:confirmations => "confirmations", :registrations => "registrations" } do
        match "/confirm_account", :to => "confirmations#confirm_account"
    end

Я получаю:

У вас есть нулевой объект, когда вы его не ожидали!Возможно, вы ожидали экземпляр Array.Ошибка возникла при вычислении nil. []

{"utf8"=>"✓",
 "authenticity_token"=>"dsG/e8Tw2Oi6zEDb07R/L0yDOKFEFlse+IgLbfz3Lo0=",
 "user"=>{"confirmation_token"=>"",
 "password"=>"[FILTERED]",
 "password_confirmation"=>"[FILTERED]"},
 "commit"=>"Confirm Account"}

В URL определенно есть токен ... Хотя, на самом деле, он куда-то идет!

1 Ответ

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

Мне кажется, что confirm_account_path не существует?

Если вы не настраивали свои маршруты вручную, вы можете установить его в файле config/routes.rb на confirmations#confirm_account.

Или, если вы настроите Devise на использование ConfirmationsController, использование new_user_confirmation_path также может работать (и может не работать).Введите rake routes в консоли, чтобы увидеть доступные маршруты.Они должны привести к действиям ConfirmationsController и confirm_account.

РЕДАКТИРОВАТЬ: попробуйте отредактировать файл маршрутов следующим образом.

devise_for :user, :controllers => {:confirmations => "confirmations", :registrations => "registrations" } do
    match "/confirm_account" => "confirmations#confirm_account"
end

I думаю косая чертаважен до confirm_account, потому что теперь он находится внутри блока devise_for (что идентично devise_scope).В противном случае он может перейти к users/confirm_account.

EDIT2: используйте params[:user][:confirmation_token], а не params[:account][:confirmation_token] в контроллере.Но в настоящее время похоже, что токен подтверждения пуст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...