私はこのチュートリアルを逐語的に従いました:
https://github.com/plataformatec/devise/wiki/How-To:-Email-only-sign-up
しかし、ユーザーが確認リンクをクリックすると、パスワードを設定する画面は表示されませんが、確認済みに設定されます。ログを確認しましたが、確認コントローラーにリクエストを送信しますが、ビューは表示されません。トークンを処理して、ログインしたルートにリダイレクトするだけです。
Started GET "/users/confirmation?confirmation_token=gs5NCZTu3hSJeWqCGDr6" for 127.0.0.1 at 2013-08-18 00:15:06 +0100
Processing by Devise::ConfirmationsController#show as HTML
Parameters: {"confirmation_token"=>"gs5NCZTu3hSJeWqCGDr6"}
[1m[36mUser Load (0.3ms)[0m [1mSELECT "users".* FROM "users" WHERE "users"."confirmation_token" = 'gs5NCZTu3hSJeWqCGDr6' LIMIT 1[0m
[1m[35m (0.1ms)[0m BEGIN
[1m[36m (0.5ms)[0m [1mUPDATE "users" SET "confirmation_token" = NULL, "confirmed_at" = '2013-08-17 23:15:06.840455', "updated_at" = '2013-08-17 23:15:06.841240' WHERE "users"."id" = 4[0m
[1m[35m (0.4ms)[0m COMMIT
[1m[36m (0.1ms)[0m [1mBEGIN[0m
[1m[35m (0.3ms)[0m UPDATE "users" SET "last_sign_in_at" = '2013-08-17 23:15:06.843987', "current_sign_in_at" = '2013-08-17 23:15:06.843987', "last_sign_in_ip" = '127.0.0.1', "current_sign_in_ip" = '127.0.0.1', "sign_in_count" = 1, "updated_at" = '2013-08-17 23:15:06.844495' WHERE "users"."id" = 4
[1m[36m (0.3ms)[0m [1mCOMMIT[0m
Redirected to http://0.0.0.0:5000/
私のルート(指示どおり)は次のとおりです。
devise_for :users, :controllers => { :registrations => "registrations", :confirmations => 'confirmations' }
devise_scope :user do
put "/confirm" => "confirmations#confirm"
end
そして、私は app/views/devise/confirmations と app/views/confirmations に show.html.erb を持っています。
彼らがあなたに作ってもらったこのコントローラーと何か関係があるのではないかと思います:
class ConfirmationsController < Devise::ConfirmationsController
def show
self.resource = resource_class.find_by_confirmation_token(params[:confirmation_token]) if params[:confirmation_token].present?
super if resource.nil? or resource.confirmed?
end
ここでビューをレンダリングすることになっていますか? this のスーパークラスが呼び出されないため、次のいずれかが表示されます。
def show
self.resource = resource_class.confirm_by_token(params[:confirmation_token])
if resource.errors.empty?
set_flash_message(:notice, :confirmed) if is_navigational_format?
sign_in(resource_name, resource) if Devise.allow_insecure_sign_in_after_confirmation
respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
else
respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new }
end
end
編集:確認コントローラーのコードを変更しrender :action => "show"
て、コントローラーが使用されていることを確認しましたが、効果はありませんでした。私は再確認しましたがrake routes
、それは正しいようですが、オーバーライドしていないようです:
POST /users/confirmation(.:format) confirmations#create
GET /users/confirmation/new(.:format) confirmations#new
GET /users/confirmation(.:format) confirmations#show
confirmation PUT /confirmation(.:format) confirmations#confirm