如何在设计插件Rails3中更改登录和注册URL

时间:2011-03-03 11:45:59

标签: ruby-on-rails-3 devise

我在新的Rails 3 App中使用设备插件。我的问题是设计插件有登录和注册的默认根

/users/sign_in
/users/sign_up

我需要将其更改为

/login 
/signup

为此,我使用了以下路由

 devise_for :users do
   get "login", :to => "devise/sessions#new"
   get "signup", :to => "devise/registrations#new"
 end

有了这个,我需要在我的视图中指定'login_path'和'signup_path',其中new_user_session_path和new_user_registration_path来自哪里

我想要的是路由中的配置,它将'/ login'和'/ signup'映射到new_user_session_path和new_user_registration_path。

我已经看到使用下面显示的路由将路由/ users / sign_in和/ users / sign_up路由到/ sign_in和/ sign_up。

  devise_for :user, :as => ''

我需要一些这样的路由技术,将/ users / sign_in和/ users / sign_up路由到/ login和/ signup。

有人可以帮我解决这个问题。

更新:我已将routes.rb文件更改为

  devise_for :users,
         :controllers => { :sessions => 'devise/sessions'},
         :skip => [:sessions] do
       get '/login' => "devise/sessions#new", :as => :new_user_session
       post '/login' => 'devise/sessions#create', :as => :user_session
       get '/signout' => 'devise/sessions#destroy', :as => :destroy_user_session
       get '/signup' => 'devise/registrations#new', :as => :new_user_registration
  end

但是当我在我的视图中使用link_to'new_user_registration'时,它在浏览器中没有显示为'/ signup'

6 个答案:

答案 0 :(得分:32)

这里的选项比你提出的要多一些,但很明显:

  devise_for :users,
             :controllers => { :registrations => "users/registrations",
                               :confirmations => "users/confirmations",
                               :sessions => 'devise/sessions'},
             :skip => [:sessions] do
    get '/signin'   => "devise/sessions#new",       :as => :new_user_session
    post '/signin'  => 'devise/sessions#create',    :as => :user_session
    get '/signout'  => 'devise/sessions#destroy',   :as => :destroy_user_session
    get "/signup"   => "users/registrations#new",   :as => :new_user_registration
  end

更重要的是,使用:registrations => "users/registrations"我们还可以自定义重定向:

class Users::RegistrationsController < Devise::RegistrationsController
  protected

  def after_sign_up_path_for(resource)
    welcome_path # it's not a home path
  end

  def after_update_path_for(resource)
    edit_user_registration_path
  end
end

Devise有一个很好的wiki

答案 1 :(得分:3)

我能够通过在我的路线中使用以下代码来解决我的问题

  devise_for :users,
           :controllers => { :sessions => 'devise/sessions'},
           :skip => [:sessions] do
    get '/login'   => "devise/sessions#new",       :as => :new_user_session
    post '/login'  => 'devise/sessions#create',    :as => :user_session
    get '/signout'  => 'devise/sessions#destroy',   :as => :destroy_user_session
    get "/signup" => "devise/registrations#new", :as => :new_user_registration
  end

但如果我使用

,仍然在我的观点中
  link_to "Register", new_user_registration_path

在我的浏览器中显示为

  /user/sign_up   and not as /signup

但如果我直接输入/注册,我会收到注册页面。我需要在这里做任何映射。

答案 2 :(得分:2)

我希望我不会太迟;)

这是它的工作原理(只需将它粘贴在您的routes.rb中就可以了):

  devise_for :users, :controllers => {:sessions => 'devise/sessions'}, :skip => [:sessions] do
    get 'login' => 'devise/sessions#new', :as => :new_user_session
    post 'login' => 'devise/sessions#create', :as => :user_session
    get 'logout' => 'devise/sessions#destroy', :as => :destroy_user_session
    get 'register' => 'devise/registrations#new', :as => :new_user_registration
  end

答案 3 :(得分:1)

编辑config / routes.rb

devise_for:用户,路径:''

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

     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   /secret(.:format)                        devise/passwords#create
           new_user_password GET    /secret/new(.:format)                    devise/passwords#new
          edit_user_password GET    /secret/edit(.:format)                   devise/passwords#edit
                             PATCH  /secret(.:format)                        devise/passwords#update
                             PUT    /secret(.: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/cmon_let_me_in(.:format)       devise/registrations#new
      edit_user_registration GET    /register/edit(.:format)                 devise/registrations#edit
                             PATCH  /register(.:format)                      devise/registrations#update
                             PUT    /register(.:format)                      devise/registrations#update
                             DELETE /register(.:format)                      devise/registrations#destroy

答案 4 :(得分:1)

由于这可能仍然是人们寻找该问题时获得的n°1结果,因此可能有必要指出,现在有一种简单的方法可以做到这一点:

private static var _homeApiCalled = false

参考:https://github.com/heartcombo/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes

答案 5 :(得分:0)

如果我正确地阅读并理解你的问题,那么你就是在'匹配'之后。

devise_for :users
match "/login" => "devise/sessions#new"
match "/signup" => "devise/registrations#new"

请确保按正确顺序排列它们,因为它们根据文件中的行号进行匹配。

更多信息可在以下网址找到:http://guides.rubyonrails.org/routing.html