2015-04-14 3 views
1

я застрял с методом after_sign_in_path_for из завещанию, это вещь ... У меня есть две модели Пользователи и AdminUsers I «м с использованием active_admin каменьRails 4 Разрабатывают с after_sign_in_path_for (ресурс) всегда перенаправлять Показать действие модели

мой файл routes.rb, выглядит следующим образом:

devise_for :admin_users, ActiveAdmin::Devise.config 
    ActiveAdmin.routes(self) 
scope "(:locale)", locale: /es|en/ do 
     devise_for :users, path_names: { sign_in: 'login', sign_out: 'logout', 
            password: 'password', confirmation: 'confirmation', unlock: 'unlock', 
            registration: 'registration', sign_up: 'sign_up' } 
    devise_scope :user do 
     get "login", to: "devise/sessions#new" 
    end 
get 'dashboard/index' 
end 

OK ... в моем application_con troller.rb, я судимый эти коды:

def after_sign_in_path_for(resource) 
     case resource 
      when AdminUser 
      #admin_root_path 
      '/admin/dashboard' 
      puts'in admin_root_path' 
      when User 
      #dashboard_index_path 
      '/dashboard/index' 
      puts'in dashboard_index_path' 
     else super 
     end 
     puts 'resource Of AplicationController: ' + resource.class.to_s 

    end 

    def after_sign_out_path_for(resource_or_scope) 
    root_path 
    end 

Как вы можете видеть, у меня есть некоторый ставит просто проверить в моей консоли, если мой случая работает ... и это делает, он на самом деле работает, это моя консоль: Я пытаюсь войти в систему как AdminUser, к admin_root_path из active_admin

Started POST "/admin/login?locale=es" for ::1 at 2015-04-14 12:46:51 -0400 
Processing by ActiveAdmin::Devise::SessionsController#create as HTML 
.... 
.... 
in admin_root_path 
resource of AplicationController: AdminUser 
Redirected to http://localhost:3000/admin/users/2?locale=es 
Completed 302 Found in 113ms (ActiveRecord: 1.8ms) 

Как вы можете видеть, Разрабатывают переадресовать меня на шоу странице у.е. rrent_admin_user.

А вот консоль, если я пытаюсь войти в систему как пользователь:

Started POST "/es/users/login" for ::1 at 2015-04-14 12:51:18 -0400 
Processing by Devise::SessionsController#create as HTML 
... 
... 
in dashboard_index_path 
resource of AplicationController: User 
Redirected to http://localhost:3000/es/users/2 
Completed 302 Found in 106ms (ActiveRecord: 1.4ms) 

В двух сценариях DEViSE делает то же самое ... перенаправляется на шоу действия каждой модели, я уже судимое поставить этот код в пользовательский registrations_controller.rb и тот же ... Может быть, мне не хватает чего-то очевидного, я не эксперт в Devise, есть ли у кого-нибудь представление о том, что я делаю неправильно?

Соответствующие результаты rake routes команды

.... 
.... 
edit_admin_user_password GET /admin/password/edit(.:format)     active_admin/devise/passwords#edit 

admin_root GET  /admin(.:format) admin/dashboard#index 
.... 
.... 
admin_dashboard GET /admin/dashboard(.:format) admin/dashboard#index 
.... 
.... 
dashboard_index GET (/:locale)/dashboard/index(.:format) dashboard#index {:locale=>/es|en/} 
root GET / visitors#index 
+0

запустите «рейк-маршруты» в терминале и проверьте пути. также вставьте результат здесь. –

+0

Done, пожалуйста, дайте мне знать, если вам нужно что-то еще, я просто опубликовать наиболее значимые маршруты ... – svonborries

ответ

1

Пожалуйста, попробуйте следующее:

def after_sign_in_path_for(resource) 
    if resource.class == AdminUser 
    admin_root_path 
    elsif resource.class == User 
    dashboard_index_path 
    end 
end 

Две вещи, чтобы заботиться: Я использую resourse.class Я думаю, что это опечатка в вопросе, а не в коде (потому что он печатает puts). Во-вторых, after_sign_in_path должен вернуть URL-адрес, а последнее действие в вашем коде - puts, которое возвращает nil.

Также вы можете попробовать:

def after_sign_in_path_for(resource) 
    dashboard_index_path 
end 

Чтобы увидеть after_sign_in_path_for работает впервые. И двигайтесь вперед от этой отправной точки.

Если все это не поможет, пожалуйста, опубликуйте sign_in и login маршрутов.

Edit: После прочтения вашего поста я понимаю, что дело не (неправильно: она работает) работы, потому что дело работает с === и resource.class === AdminUser всегда возвращает ложные (которые Diferent объектов). Вы должны запросить resource.class == AdminUser или resource.is_a?(AdminUser). Больше подходит для случая here. Я также обновляю метод after_sign_in_path.

Edit 2 После прочтения @CJBrew комментарий, и эти эксперименты на IRB:

(main) > pp = Person.first 
=> "#<Person id: 1 ..." 
(main) > pp === Person 
=> false 
(main) > Person === pp 
=> true 
(main) > case pp 
(main) | when Person 
(main) | 'yes' 
(main) | end 
=> "yes" 

Я могу сказать, что этот код должен работать нормально:

def after_sign_in_path_for(resource) 
    case resource 
    when User 
    root_path 
    when AdminUser 
    admin_contexts_path 
    end 
end 

Поскольку case=== использование с значение when как объект и значение case в качестве параметра. В этом случае первое условие, когда предложение проверено: User.===(resource) или User === resource, а второе - AdminUser.===(resource). Поскольку User и AdminUser являются объектами класса, они используют Module#=== method. Здесь важно знать, что этот метод не является коммутативным, это метод класса, который принимает любой объект как param и возвращает true, если param является экземпляром этого класса.

+0

На самом деле, это работает для меня: '' 'Защиту after_sign_in_path_for (ресурс) случае ресурс когда пользователь root_path когда AdminUser admin_contexts_path end end''' – CJBrew

+0

Спасибо @ CJBrew, вы заставляете меня думать и исследовать. И, конечно же, я обновляю ответ. –

+0

'resource.is_a? Пользователь больше Rails-like –

0

Большое спасибо Алехандро,

Вы были правы с моим ставит ошибку, на самом деле я смущен такой очевидной ошибки с возвращения метода ... По некоторым причинам extrange что я не знаю, что дело не работает ... Это было для модели AdminUser, но никогда для Пользователь модель ... Если у кого-то есть идея, сообщите мне, потому что я ненавижу состояние с сомнениями , и правильно знаю, что мне не хватает времени на обход ...

Я сделал это небольшие изменения в коде и работает для меня ... Я знаю, что это жесткий и уродливый код, но он выполняет эту работу, возможно, позже у меня есть время, чтобы сделать лучший код.

def after_sign_in_path_for(resource) 
    return dashboard_index_path if resource.class == User 
    return admin_root_path 
end 

спасибо!

+0

Добро пожаловать. Я обновляю свой ответ с помощью обновления '' 'case''' no go. –

Смежные вопросы