设计after_sign_in_path_for,但不是其他的

时间:2013-10-18 14:14:38

标签: ruby-on-rails ruby-on-rails-3 devise

我真的在这里错过了什么。

我已经阅读了许多关于设计重定向的内容(对于大多数人来说似乎很难实现......)但在我的情况下,我真的没有得到它。

有时我读到方法after_<action>_path_for(resource)应该在ApplicationController中,有时它被提到是在特定的控制器中,覆盖了设计。

我宁愿把它们放在我的ApplicationController中,因为它困扰我创建更多的控制器只是为了重定向,但如果最终不可能,我不会坚持......

这是交易:

我在我的ApplicationController :(以及其他一些人,但这足以说明这个例子)

  def after_update_path_for(user)
    flash[:notice] = 'Successfully updated password'
    edit_user_path(user)
  end

  def after_inactive_sign_up_path_for(user)
    flash[:notice] = 'Welcome! Please follow the steps!'
    me_new_path
  end

  def after_sign_up_path_for(user)
    flash[:notice] = 'Welcome! Please follow the steps!'
    me_new_path
  end

  def after_sign_in_path_for(user)
    if user.sign_in_count == 1
      me_new_path
    else
      root_path
    end
  end

疯狂的是,after_sign_in_path_for被称为,而不是其他人。就像用户注册时一样,重定向他的是if user.sign_in_count == 1,而不是after_inactive_sign_up_path_forafter_sign_up_path_for

怎么来?

它可能与我的路线有关,所以这是我的routes.rb提取物:

  devise_for :user, :skip => [:sessions, :registrations], :path => ''
  devise_scope :user do
    get :register, :to => 'devise/registrations#new'
    post :register, :to => 'devise/registrations#create'
    put :update_password, :to => 'devise/my_registrations#update'
    get :login, :to => 'devise/sessions#new'
    get :login, :to => 'devise/sessions#new', :as => :new_copasser_session
    post :login, :to => 'devise/sessions#create'
    delete :logout, :to => 'devise/sessions#destroy'
  end

我正在使用Devise 3.1.0和Ruby 1.9.3以及Rails 3.2.13

感谢您的帮助!


修改

感谢@ rich-peck的回答。我用这种方式更新了routes.rb

  devise_for :users, :path => '', :path_names => { 
    :sign_in => :login,
    :registration => :register,
    :sign_up => '',
    :sign_out => :logout
  }

给了我与之前相同的路由(除了我不能再使用login_path助手了,但这不是什么大问题),但我仍然得到与重定向相同的结果。

以下是rake routes的结果:

                       new_user_session GET    /login(.:format)                                               devise/sessions#new
                           user_session POST   /login(.:format)                                               devise/sessions#create
                   destroy_user_session DELETE /logout(.:format)                                              devise/sessions#destroy
                          user_password POST   /password(.:format)                                            devise/passwords#create
                      new_user_password GET    /password/new(.:format)                                        devise/passwords#new
                     edit_user_password GET    /password/edit(.:format)                                       devise/passwords#edit
                                        PUT    /password(.:format)                                            devise/passwords#update
               cancel_user_registration GET    /register/cancel(.:format)                                     devise/registrations#cancel
                      user_registration POST   /register(.:format)                                            devise/registrations#create
                  new_user_registration GET    /register(.:format)                                            devise/registrations#new
                 edit_user_registration GET    /register/edit(.:format)                                       devise/registrations#edit
                                        PUT    /register(.:format)                                            devise/registrations#update
                                        DELETE /register(.:format)                                            devise/registrations#destroy
                      user_confirmation POST   /confirmation(.:format)                                        devise/confirmations#create
                  new_user_confirmation GET    /confirmation/new(.:format)                                    devise/confirmations#new
                                        GET    /confirmation(.:format)                                        devise/confirmations#show

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

感谢@ rich-peck的帮助,我们明白了。

问题是为什么after_sign_in_path_for的行为与after_sign_up_path_for和cie不同?

看起来in the devise sourcesafter_sign_in_path_for是在帮助器中定义的,而其他的是其控制器的方法(例如Devise::RegistrationsController < DeviseController

因此,对于after_sign_in_path_for,它会覆盖ApplicationController,而对于其他文件,则需要创建一个registrations_controller.rb文件,以覆盖其中的方法:

class RegistrationsController < Devise::RegistrationsController
  protected

  def after_sign_up_path_for(copasser)
    flash[:notice] = 'Welcome! Please follow the steps!'
    me_new_path
  end

end

并以这种方式设置router.rb

devise_for :copassers, :controllers => { 
    :registrations => :registrations
  }

我认为行为是不同的,因为:registerable, :recoverable等是设计模块,不一定使用,并且在这种情况下帮助器不合适。设计撰稿人可以在这一点上帮助我们。

答案 1 :(得分:0)

Devise严重依赖于一个名为“资源”的中心变量。此变量定义了设计如何在您的系统上运行,这也是您必须将“设备”附加到:用户或类似设备的原因

人们会遇到Devise的问题,因为他们不遵守惯例,并且无处不在。如果他们阅读了Devise自述文件,他们会感激它非常灵活:)

我认为你的问题与你的路线有关,因为你可能希望将所有这些静态路由合并为:

devise_for :users, :path => '', :controllers => {:sessions => 'sessions', :registrations => 'registrations'}, :path_names => { :sign_in => 'login', :password => 'forgot', :confirmation => 'confirm', :unlock => 'unblock', :registration => 'register', :sign_up => 'new', :sign_out => 'logout'}