【问题标题】:Change default routes Devise Rails更改默认路线 Devise Rails
【发布时间】:2017-10-15 14:26:13
【问题描述】:

我有这个routes.rb

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

我更改了sign_insign_up 路由,如果您转到sign_up,您将收到404 错误,而/registration 将起作用。我想要的是以相同的方式更改和添加其他路线,例如忘记密码。 如果我在控制台输入rake routes,我会看到忘记密码:

new_user_password GET /password/new(.:format) 设计/密码#new

如何以我的自定义路由将起作用但不是默认路由的方式添加其他路由?

【问题讨论】:

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


    【解决方案1】:

    请务必查看 ActionDispatch::Routing::Mapper#devise_for 文档here

    你可以简单地做这样的事情-

    devise_for :users, path: 'auth', path_names: { sign_in: 'login', 
                                                   sign_out: 'logout',
                                                   password: 'secret',
                                                   confirmation: 'verification',
                                                   unlock: 'unblock', 
                                                   registration: 'register',
                                                   sign_up: 'cmon_let_me_in' }
    

    【讨论】:

    • 是的,我试过这个,path_names: {password: '/forgotten-password'},,但它会生成这样的 URL localhost:3000/forgotten/new,我不想要这个字符串 new
    【解决方案2】:

    以下是会话、注册和密码控制器操作/路由的示例:

    devise_for :users, skip: [:sessions, :registrations, :passwords]
    
    devise_scope :user do
      # sessions
      get    'login',  to: 'devise/sessions#new',     as: :new_user_session
      post   'login',  to: 'devise/sessions#create',  as: :user_session
      delete 'logout', to: 'devise/sessions#destroy', as: :destroy_user_session
      # registrations
      put    '/account',  to: 'devise/registrations#update'
      delete '/account',  to: 'devise/registrations#destroy'
      post   '/account',  to: 'devise/registrations#create'
      get    '/register', to: 'devise/registrations#new',    as: :new_user_registration
      get    '/account',  to: 'devise/registrations#edit',   as: :edit_user_registration
      patch  '/account',  to: 'devise/registrations#update', as: :user_registration
      get    '/account/cancel', to: 'devise/registrations#cancel', as: :cancel_user_registration# passwords 
      # passwords
      get   'new-pass',  to: 'devise/passwords#new',    as: :new_user_password
      get   'edit-pass', to: 'devise/passwords#edit',   as: :edit_user_password
      patch 'edit-pass', to: 'devise/passwords#update', as: :user_password
      post  'new-pass',  to: 'devise/passwords#create', as: :user_password
    end
    

    this wiki 中的第四个代码示例块所示

    【讨论】:

    • 我知道如何为 :sessions 和 :registrations 做到这一点。 :passwords 不一样,我不知道是什么。这就是我问的原因。
    • 密码也是一样的。您是否尝试过我上面的密码示例?你必须先跳过控制器然后重新声明
    【解决方案3】:

    您需要跳过passwords并根据需要重建其路线,

    devise_for :users, skip: [:passwords]
    devise_scope :user do
      match '/forgotten-password' => 'devise/passwords#create', as: :user_password, via: [:post]
      match '/forgotten-password' => 'devise/passwords#update', via: [:put, :patch]
      get 'forgotten-password', to: 'devise/passwords#new', as: :new_user_password
    

    结束

    您的自定义路线将起作用。它会跳过该模块中的所有路由。

    注意:您需要根据需要覆盖该模块的所有剩余路由。

    【讨论】:

    • 嗨,是的,我做到了。问题是,有相同 URL 和操作的 PUT 和 PATCH 请求,如果我在 routes.rb 中更改它 - ` match '/forgotten-password' => 'users/passwords#update',如::password, via: [:put, :patch]` 然后使用 Devise 的默认视图。为表单生成的 URL - <%= form_for(resource, as: resource_name, url: password_path(resource_name),/forgotten.user,这不是正确的 URL。
    • 哦,您需要格式化所有路线。以及您需要照顾关键:as,因为根据资源设计更新路线。 as: :possword 不工作。请检查更新的答案答案
    • 更改路由后,请重启服务器。所以设计可以理解你的新路线。
    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 2013-11-04
    • 2012-01-13
    • 2015-09-08
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多