Rails Devise after_sign_in_path_for (resource) метод не работает должным образом - PullRequest
4 голосов
/ 22 января 2012

Я хочу перенаправить неактивного пользователя на путь регистрации, чтобы собрать некоторую информацию. Вот два подхода, которые я выбрал, но ни один не работает:

Я переопределил метод devise after_sign_in_path следующим образом (в application_controller.rb ):

def after_sign_in_path_for(resource)
    debugger
    if(account_active)
        return root_path;
    else
        return edit_user_registration_path(resource)
    end
end

Когда я подключил код к отладчику, я вижу, что devise вызывает after_sign_in_path_for. Кроме того, этот вызов генерирует правильный URL:

(rdb:2)  after_sign_in_path_for(resource)
"/users/edit.1"

Однако, когда я просматриваю логи сервера, не делается никаких попыток перенаправить на /users/edit.1 ни при каких обстоятельствах.

Я попытался переместить вышеуказанный метод в application_helper.rb, session_controller.rb (путем расширения Devise :: SessionController) и session_helper.rb

Проблема в том, что devise вызывает этот метод для получения URL, но никогда не пытается перенаправить. Я проверил логи веб-сервера, и devise напрямую перешел на URL user_root.

Вот соответствующая конфигурация устройства от маршрутов. Rb:

devise_for :users do
    resource :registration,
    only: [:new, :create, :edit, :update],
    path: 'users',
    path_names: { new: 'sign_up' },
    controller: 'devise/registrations',
    as: :user_registration do
        get :cancel
    end


    root :to => "home#index"        
end

  match '/user' => "products#index", :as => 'user_root'

Любые предложения о том, что я должен попробовать?

Спасибо

Tabrez

Ответы [ 2 ]

3 голосов
/ 22 января 2012

Вы уверены, что хотите перенаправить на /users/edit.1?Rails подхватит это, как будто вы пытаетесь получить доступ к mime-типу 1 вместо html.

Путь регистрации пользователя не нуждается в идентификаторе, потому что он всегда принадлежит текущему вошедшему в системупользователь.Этого должно быть достаточно:

def after_sign_in_path_for(resource)
  if account_active
    root_path
  else
    edit_user_registration_path
  end
end

Кроме того, размещение в ApplicationController является правильным местом.Если у вас есть собственный контроллер сессий, такой как Users::SessionsController, который наследуется от Devise::SessionsController, то он тоже может туда войти.

Так что либо метод account_active не делает то, что вы думаете, он делаетили вы испортили файл маршрутов.Попробуйте поработать с более ванильной конфигурацией ваших маршрутов, чтобы узнать, так ли это:

devise_for :users

PS.как полное совершенно не связанное примечание: пожалуйста, попробуйте использовать соглашения о кодировании Ruby, например, не используйте точки с запятой, когда они не нужны, не ставьте круглые скобки в операторах if, отступы в двух пробелах и ненужные операторы возврата.

0 голосов
/ 29 января 2013

Это может не относиться к вам, но в моем недавнем использовании devise + active_admin я столкнулся с теми же проблемами, которые вы описываете. Я добавил переопределение devise во время работы моего сервера rails разработки и предположил, что rails / devise автоматически выберет метод. Очевидно, нет, так как проблема была решена, когда я перезапустил свой сервер .

Кажется, что devis выбирает эти методы из ApplicationController при инициализации, хотя я не смотрел на источник.

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