Да, вроде.Вы можете полностью переписать используемые контроллеры devise и написать свои собственные (наследуя Devise, если это необходимо). Эта вики-страница может служить ориентиром.
Редактировать
Почему я сказал своего рода:)
Переопределение сеансов с использованием:
devise_for :users, :controllers => { :sessions => 'custom_devise/sessions'}, :skip => [:sessions] do
get 'sign_in' => 'custom_devise/sessions#new', :as => :new_user_session
post 'sign_in' => 'custom_devise/sessions#create', :as => :user_session
end
даст вам только два маршрута [: get,: post], но не: destroy
new_user_session GET /sign_in(.:format) {:controller=>"custom_devise/sessions", :action=>"new"}
user_session POST /sign_in(.:format) {:controller=>"custom_devise/sessions", :action=>"create"}
Таким образом, по сути, вы пропустите уничтожить / удалить маршрут.Теперь в контроллере вы можете перейти:
class SessionsController < Devise::SessionsController
def new
super
end
def create
super
end
end
Теперь вы можете повторить процесс регистрации, паролей и разблокировок.
Второе редактирование
Ах, да, есть еще один,более простой способ.Вы можете вручную создавать маршруты ( документация ), используя devise_scope, также известный как "as", без переопределения:
as :user do
get "sign_in", :to => "devise/sessions#new"
post "sign_in", :to => "devise/sessions#create"
...
end
Дает:
sign_in GET /sign_in(.:format) {:controller=>"devise/sessions", :action=>"new"}
POST /sign_in(.:format) {:controller=>"devise/sessions", :action=>"create"}
Третье редактирование
Кроме того, вы можете перезаписать часть Devise , отвечающую за создание этих маршрутов (только для использования в приложениях, которые вообще не будут иметь никакого "разрушающего" маршрута), создав инициализатор:
module ActionDispatch::Routing
extend ActionDispatch::Routing
class Mapper
protected
def devise_session(mapping, controllers) #:nodoc:
resource :session, :only => [], :controller => controllers[:sessions], :path => "" do
get :new, :path => mapping.path_names[:sign_in], :as => "new"
post :create, :path => mapping.path_names[:sign_in]
end
end
def devise_registration(mapping, controllers) #:nodoc:
path_names = {
:new => mapping.path_names[:sign_up],
:cancel => mapping.path_names[:cancel]
}
resource :registration, :only => [:new, :create, :edit, :update], :path => mapping.path_names[:registration],
:path_names => path_names, :controller => controllers[:registrations] do
get :cancel
end
end
end
end
Обратите внимание, что это исправление удаляет все маршруты уничтожения , используемые в Devise (в сессиях и регистрациях их только два), и это исправление только для этого конкретного случая.
Дополнительно
Вы также можете добавить: кроме опции к маршрутам.Чтобы сделать это, вы должны добавить метод devise_for
( скопировать его из оригинального и изменить в соответствии с вашими пожеланиями) в класс Mapper, чтобы он отправлял [: кроме] члена опций вышеупомянутому (вcode) private методы. Затем вы должны изменить их для добавления маршрутов в зависимости от условий.
Самый быстрый и грязный способ - добавить @scope [: исключением] = опции [: кроме] и затем изменить частныйметоды, так что кроме хэша (если вы решите иметь детальное управление маршрутом, например: :except => {:sessions => [:destroy]}
, что делает :skip
устаревшим) или массив (если вы хотите удалить это конкретное действие из всех маршрутов, например: :except => [:destroy]
), этопроверяйте перед добавлением маршрута.
В любом случае, есть много способов добиться того, что вам нужно.Вам решать, какой из них вы считаете наиболее подходящим.