Подтвердить что ты не робот

Переадресация обратного вызова, не сохраняющая сеанс

У меня есть сценарий, который отлично работает, когда я использую настоящий омнят, но не удается, когда я запускаю его с помощью макета auth в огурце /capybara.

В обратном вызове, когда я делаю sign_in @user, он успешно создает пользователя и регистрируется журнал... current_user. Но когда я тогда выполняю redirect_to request.env['omniauth.origin'] || '/', внутри последующего действия current_user теперь равно nil.

Я подтвердил с помощью скриншотов/приостановку браузера, что он не работает с макетом auth. Такая же ошибка возникает в драйверах firefox и chrome.

Любая идея относительно того, почему это происходит?

/features/support/env.rb:

Cucumber::Rails::Database.javascript_strategy = :truncation

Сценарий:

@javascript
Scenario:
    Given I am on the home page
    When I press "Login"
    And I should see "Login with Twitter" in the selector "#login-modal"
    Given Omniauth returns a user with provider "twitter" and uid "1" and nickname "foo"    
    When I login with Twitter
    Then I should be logged in as "foo"

Определения шага:

Given(/^Omniauth returns a user with provider "(.*?)" and uid "(.*?)" and nickname "(.*?)"$/) do |provider, uid, nickname|
  OmniAuth.config.test_mode = true

 OmniAuth.config.add_mock(provider.to_sym, {
     :uid => uid,
     :info => {
       :name => nickname
     }
   })
end

Then(/^I should be logged in as "(.*?)"$/) do |nickname|
  expect(page).to have_content(nickname)
end

Обратный вызов Auth:

def twitter
  @user = User.from_omniauth(request.env["omniauth.auth"]) # this works-- I get the mock
  sign_in @user
  puts ">> in auth callback: just signed in user #{current_user.id}"        
  redirect_to request.env['omniauth.origin'] || '/'
end

Контроллер:

def new
  puts ">> in my_controller#new: current_user = #{current_user.id if current_user}"
end

Выход огурца:

Given Omniauth returns a user with provider "twitter" and uid "1" and nickname "foo" 
>> in auth callback: just signed in user 1
>> in my_controller#new: current_user =
When I login with Twitter                                                                 
Then I should be logged in as "foo"                                                  
  expected to find text "foo" in [redacted] (RSpec::Expectations::ExpectationNotMetError)
4b9b3361

Ответ 1

Вы получаете пользователя и собираете его в новую переменную @user, но при повторном вызове метода sign_in вы инициализировали новую переменную с помощью (например, @user)