0

私はこのコントローラーを持っています。

class SessionsController < Devise::SessionsController
  # GET /resource/sign_in
  def new
    self.resource = build_resource(nil, :unsafe => true)
    clean_up_passwords(resource)
    respond_with(resource, serialize_options(resource))
  end

  # POST /resource/sign_in
  def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in, :username => resource.username) if is_navigational_format?
    sign_in(resource_name, resource)
   respond_with resource, :location => after_sign_in_path_for(resource)
 end
end

そしてキュウリのこのステップ定義:

Given /^a user "(.*?)" exists$/ do |user_name|
    @user = User.create!(:username => user_name , :password => "tamara")
end

When /^he logs in$/ do 
  visit("/users/sign_in")
  fill_in('Username', :with => "roelof")
  fill_in('Password', :with => "tamara")
  click_button('Sign in')
end

Then /^he should see "(.*?)"$/ do |message|
  page.should have_content(message)
end

ログインが成功した後にのみすべてが正常に機能し、ログイン成功ページではなくホームページにリダイレクトされます。そのため、フラッシュメッセージは表示されません。

ロエロフ

編集 1: コントローラーと resource_name を確認しましたが、resource の値が正しいようです。

4

2 に答える 2

0

デフォルトでは、Deviseの内部after_sign_in_path_for(resource)メソッドは最初にセッションで有効な{resource} _return_toキーを見つけようとし、次に{resource} _root_pathにフォールバックします。それ以外の場合は、ルートパスルートを使用します。

たとえば、設定user_root_pathすると、サインインが成功した後、ユーザースコープに直接パスが設定されます(おそらく必要なもの)。

# config/routes.rb
...
devise_for :users do
 get 'users', :to => 'users#show', :as => :user_root 
end

あるいは:

# config/routes.rb
...
match 'user_root' => 'users#show'

ログインが成功したときにリダイレクトをオーバーライドする別の方法after_sign_in_path_for(resource)

# app/controllers/application_controller.rb
...
def after_sign_in_path_for(resource)
  # Put some path, like:
  current_user_path
end

あなたが読むためのリンク:

于 2012-11-10T09:23:53.353 に答える
0

after_sign_in_path_for の標準の DeviseHelper は signed_in_root_path です

  # The scope root url to be used when he's signed in. By default, it first
  # tries to find a resource_root_path, otherwise it uses the root_path.

Routes と scope を確認し、Devise signed_in_root_path をデバッガー行で ApplicationController に複製することでデバッグすることもできます

于 2012-11-09T16:51:36.850 に答える