Разработка пользовательских маршрутов и страниц входа

Я пытаюсь заставить пользовательские маршруты работать в моем приложении Rails (Ruby 1.9.2 с Rails 3).

Это мой файл config/routes.rb

match '/dashboard' => 'home#dashboard', :as => 'user_root'
devise_for :user do
   get "/login", :to => "devise/sessions#new" # Add a custom sign in route for user sign in
   get "/logout", :to => "devise/sessions#destroy" # Add a custom sing out route for user sign out
   get "/register", :to => "devise/registrations#new" # Add a Custom Route for Registrations
end

Но отправка формы в /login или /register переходит к пользователям/sign_in и пользователям/sign_up. Как мне предотвратить это. Или, что еще лучше, убедитесь, что по умолчанию все запросы для пользователей/sign_in и т. д. идут по соответствующим маршрутам, а не по маршрутам по умолчанию, сгенерированным Devise.

Кроме того, как я могу сделать форму входа в систему частичной, чтобы включить ее в любой контроллер? Чтобы у меня была страница входа на главной странице (home#index), а не на users/sign_in?

Я использую Devise 1.1.3 с Rails 3 на Ruby 1.9.2, на Mac OSX Snow Leopard.

Спасибо!


person Karthik Kastury    schedule 30.09.2010    source источник


Ответы (6)


С Devise 1.1.3 должно работать следующее

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

Маршруты, которые он создает, не будут добавляться с "/user/...", потому что параметр :path является пустой строкой. Хэш :pathnames позаботится об именах маршрутов по вашему желанию. Devise будет использовать эти маршруты внутренне, поэтому отправка /login будет работать так, как вы хотите, а не приведет вас к /user/log_in.

Чтобы добавить форму входа на главную страницу, на Devise Wiki есть информация: http://github.com/plataformatec/devise/wiki/How-To:-Display-a-custom-sign_in-form-везде-в-вашем-приложении

Или сделайте что-то вроде этого:

 <%= form_tag new_user_session_path do %>
  <%= text_field_tag 'user[email]' %>
  <%= password_field_tag 'user[password]' %>
 <%=  submit_tag 'Login' %>
person doritostains    schedule 02.10.2010
comment
В коде вы указали: путь, в тексте вы сказали: как, исправлено. - person tokland; 26.11.2012
comment
обратите внимание, что Devise 2.1.2 (более поздняя версия) использует множественное число devise_for :users - person AJcodez; 19.01.2013
comment
Этот подход работает, но вы застряли, используя помощники пути Devise по умолчанию, такие как new_user_session_path. Чтобы получить помощников, таких как login_path, вы можете поместить блок devise_for :user do, который есть у OP, прямо под этим ответом, и вы получите лучшее из обоих миров. - person Abe Voelker; 30.11.2014

Для меня работало следующее:

  devise_for :users do
    get "/login" => "devise/sessions#new"
    get "/register" => "devise/registrations#new"
  end
person Waleed Asender    schedule 07.08.2011

Вам просто не нужно указывать свой специальный маршрут в блоке devise_for

match '/dashboard' => 'home#dashboard', :as => 'user_root'
get "/login", :to => "devise/sessions#new" # Add a custom sign in route for user sign in
get "/logout", :to => "devise/sessions#destroy" # Add a custom sing out route for user sign out
get "/register", :to => "devise/registrations#new" # Add a Custom Route for Registrations
devise_for :user

Теперь /логин работает. /users/sign_in тоже.

person shingara    schedule 30.09.2010
comment
Я не хочу, чтобы маршрут users/sign_in работал. Я хочу, чтобы работали только пользовательские маршруты, и они должны быть активны во всех контроллерах и представлениях, которые их используют. - person Karthik Kastury; 30.09.2010

Конфигурация:

  devise_scope :user do
    get 'profile/edit'    => 'devise/registrations#edit',   :as => :edit_user_registration
    get 'profile/cancel'  => 'devise/registrations#cancel', :as => :cancel_user_registration
  end

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

Маршруты:

  edit_user_registration GET    /profile/edit(.:format)      devise/registrations#edit
cancel_user_registration GET    /profile/cancel(.:format)    devise/registrations#cancel
        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
                         PATCH  /password(.:format)          devise/passwords#update
                         PUT    /password(.:format)          devise/passwords#update
                         GET    /register/cancel(.:format)   registrations#cancel
       user_registration POST   /register(.:format)          registrations#create
   new_user_registration GET    /register(.:format)          registrations#new
                         GET    /register/edit(.:format)     registrations#edit
                         PATCH  /register(.:format)          registrations#update
                         PUT    /register(.:format)          registrations#update
                         DELETE /register(.:format)          registrations#destroy
person hlcs    schedule 13.12.2015

Я создал свой собственный контроллер авторизации и перенаправил контроллер сеансов разработки на свой контроллер.

devise_for :users, 
:controllers => {
    :sessions => 'auth' },

:path => '/',

:path_names => {
    :sign_in  => 'login',
    :sign_out => 'logout' }

Этот код добавит URL-адреса /login и /logout.

Подробнее об этом вы можете узнать в исходном коде http://github.com/plataformatec/devise/blob/master/lib/devise/rails/routes.rb

person Vlada    schedule 02.10.2010
comment
Решение Canthiswait отлично работает, поэтому я не пытался создать новый собственный контроллер. - person Karthik Kastury; 02.10.2010
comment
gr8 :) конечно, вам не нужна настройка контроллера: path_names имеет решающее значение - person Vlada; 02.10.2010

Используйте это в верхней части вашего файла route.rb

map.connect "users/:action", :controller => 'users', :action => /[a-z]+/i 

используйте это там, где находится ваш индексный файл. если это относится к вашей модели пользователей, используйте вышеуказанное или измените соответствующим образом

person Jayaram    schedule 30.09.2010
comment
Будет ли это работать для наличия страниц входа на главной странице. Они находятся в home#index. А разработка (github.com/plataformatec/devise) использует пользовательскую модель. - person Karthik Kastury; 30.09.2010
comment
Не работает. Имя моего контроллера дома, и он не определяет маршрут / на домашней странице. - person Karthik Kastury; 30.09.2010