Для Rails3 приведенный выше код будет вызывать NoMethodError
:
undefined method `session=' for ActionController::Base:Class
Итак, для Rails3 вы не должны изменять конфигурацию среды, а должны app/config/initializers/session_store.rb
выглядеть так:
YourAppName::Application.config.session_store :active_record_store,
{:key => '_your_namespace_session', :domain => '.yourdomain.com'}
Также после изменения инициализатора вам необходимо перезапустить веб-сервер, чтобы применить инициализатор.
Обратите внимание, что пользователи, вошедшие в систему до обновления кода, не смогут выйти из системы после этогопоскольку действия по умолчанию для выхода из системы, которое выглядит примерно так:
destroy
current_user_session.destroy
flash[:notice] = "You have been logged out"
redirect_to root_path
end
, недостаточно - оно не удаляет файл cookie user_credentials
, установленный для домена без подстановочных знаков yourdomain.com
по умолчанию.Таким образом, вы должны добавить cookies.delete :user_credentials
к действию уничтожения, чтобы оно выглядело так:
destroy
current_user_session.destroy
cookies.delete :user_credentials
flash[:notice] = "You have been logged out"
redirect_to root_path
end
И это странно, но его следует добавить после уничтожения сеанса пользователя, несмотря на cookies[:user_credentials].is_nil? == true
на данный момент.Кроме того, существует проблема, заключающаяся в том, что после выхода пользователя из системы и последующего входа в систему, имеющих cookies.delete :user_credentials
в действии destroy
, пользователи также не могут выйти из системы, и его следует удалить.У кого-нибудь есть решение для этого?
Обновление.Наконец, я пришел к этому - я добавил логический флаг в модель User с помощью миграции:
class AddReloginedToUsers < ActiveRecord::Migration
def change
add_column :users, :relogined, :boolean, :default => false
end
end
и изменил действие уничтожения следующим образом:
def destroy
current_user_session.destroy
if !current_user.relogined
current_user.relogined = true
current_user.save
cookies.delete(:user_credentials)
end
session = nil
flash[:notice] = "You have been logged out"
redirect_to root_path
end
Теперь все работает, как ожидалось, хотяэто не очень красивое решение.Я буду рад, если кто-нибудь предоставит что-нибудь умнее.