0

我真的在这里错过了一些东西。

我已经阅读了很多关于设计重定向的内容(对于大多数人来说似乎很难实现......)但就我而言,我真的不明白。

有时我读到方法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_for不是after_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

我正在使用带有 Ruby 1.9.3 和 Rails 3.2.13 的 Devise 3.1.0

谢谢您的帮助!


编辑

感谢@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

任何想法?

4

2 回答 2

1

设计严重依赖一个称为“资源”的中心变量。这个变量定义了设计如何在你的系统上运行,这就是为什么你必须将设计“附加”到 :users 或类似的

人们在使用 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'}
于 2013-10-18T14:31:56.030 回答
1

所以感谢@rich-peck 的帮助,我们搞定了。

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

在设计源中,它似乎after_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, :recoverableetc. 是设计的模块,不一定使用,并且在这种情况下助手不合适。在这一点上,设计贡献者可以帮助我们。

于 2013-10-22T01:01:27.450 回答