Как убрать разработать маршрут, чтобы зарегистрироваться?
Я использую Devise в приложении Rails 3, но в этом случае пользователь должен быть создан существующим пользователем, который определяет, какие разрешения он/она будет иметь.
из-за этого, я хочу:
- до удалить маршрут для пользователей, чтобы зарегистрироваться.
- до по-прежнему позволяют пользователям редактировать свои профили (изменить адрес электронной почты и пароль) после они подписали
как я могу это сделать это?
в настоящее время я эффективно удаляю этот маршрут, помещая следующее Перед devise_for :users:
match 'users/sign_up' => redirect('/404.html')
это работает, но я думаю, есть лучший способ?
обновление
как сказал Бенуа Гаррет, лучшим решением в моем случае является пропустить создание маршрутов регистрации в массовом порядке и просто создать те, которые я действительно хочу.
чтобы сделать это, я сначала побежал rake routes, затем использовал выход для повторного создания тех, которые я хотел. Конец результат был такой:
devise_for :users, :skip => [:registrations]
as :user do
get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
put 'users' => 'devise/registrations#update', :as => 'user_registration'
end
внимание:
- у меня еще есть
:registerableв своемUserмодель
devise/registrationsобрабатывает обновление электронной почты и пароль- обновление других атрибутов пользователя-разрешений и т. д.-обрабатывается другим контроллером
правильный ответ:
удалите маршрут для путей Devise по умолчанию; т. е.:
devise_for :users, path_names: {
sign_up: ''
}
14 ответов:
Я тоже пытался это сделать, но нить в группе devise google отговорил меня от поиска действительно чистое решение.
Я процитирую Жозе Валима (Хранителя изобретения):
нет прямого варианта. Вы можете либо предоставить патч или использовать :пропустить => :регистрируемые и добавлять только те маршруты, которые вы хотите.
исходный вопрос был :
есть ли хороший способ, чтобы удалить конкретный маршрут (удалить маршрут) с рельсов?
вы можете сделать это в вашей модели
# typical devise setup in User.rb devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatableменяем его на:
devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatableобратите внимание, что символ
:registerableбыла изъятавот и все, больше ничего не требуется. Все маршруты и ссылки на страницу регистрации также волшебным образом удаляются.
у меня была аналогичная проблема, пытался удалить devise_invitable пути создать и новая:
перед:
devise_for :usersмаршруты грабли
accept_user_invitation GET /users/invitation/accept(.:format) devise/invitations#edit user_invitation POST /users/invitation(.:format) devise/invitations#create new_user_invitation GET /users/invitation/new(.:format) devise/invitations#new PUT /users/invitation(.:format) devise/invitations#updateпосле
devise_for :users , :skip => 'invitation' devise_scope :user do get "/users/invitation/accept", :to => "devise/invitations#edit", :as => 'accept_user_invitation' put "/users/invitation", :to => "devise/invitations#update", :as => nil endмаршруты грабли
accept_user_invitation GET /users/invitation/accept(.:format) devise/invitations#edit PUT /users/invitation(.:format) devise/invitations#updateПримечание 1 разработать область https://github.com/plataformatec/devise#configuring-routes
примечание 2. Я применяю его на devise_invitable, но он будет работать с любым devise * able feature
важное замечание: смотрите, что devise_scope включен пользователей не пользователи ? это верно, следите за этим ! Это может вызвать много боли, давая вам эту проблему:
Started GET "/users/invitation/accept?invitation_token=xxxxxxx" for 127.0.0.1 Processing by Devise::InvitationsController#edit as HTML Parameters: {"invitation_token"=>"6Fy5CgFHtjWfjsCyr3hG"} [Devise] Could not find devise mapping for path "/users/invitation/accept? invitation_token=6Fy5CgFHtjWfjsCyr3hG". This may happen for two reasons: 1) You forgot to wrap your route inside the scope block. For example: devise_scope :user do match "/some/route" => "some_devise_controller" end 2) You are testing a Devise controller bypassing the router. If so, you can explicitly tell Devise which mapping to use: @request.env["devise.mapping"] = Devise.mappings[:user]
нашел следующий пост похож на этот и хотел поделиться ответом @chrisnicola дал. В сообщении они пытались блокировать только регистрацию пользователей во время производства.
вы также можете изменить контроллер регистраций. Вы можете использовать что-то вроде этого:
на "приложение/контроллеры/registrations_controller.РБ"
class RegistrationsController < Devise::RegistrationsController def new flash[:info] = 'Registrations are not open.' redirect_to root_path end def create flash[:info] = 'Registrations are not open.' redirect_to root_path end endЭто будет переопределить контроллер разработать и использовать вместо указанных выше способов. Они добавили флэш-сообщения упаковывают, что кто-то каким-то образом добрался до страницы sign_up. Вы также должны иметь возможность изменить перенаправление на любой путь, который вам нравится.
и в " config / routes.РБ" вы можете добавить это:
devise_for :users, :controllers => { :registrations => "registrations" }оставив его, как это позволит вам использовать стандартный devise редактировать свой профиль. Если вы хотите, вы все еще можете переопределить опцию Редактировать профиль, включив
def update endв "приложение/контроллеры/registrations_controller.РБ"
вы можете переопределить "devise_scope", поместив его перед"devise_for".
devise_scope :user do get "/users/sign_up", :to => "sites#index" end devise_for :usersНе уверен, что это лучший способ но мое решение на данный момент, так как он просто перенаправляет обратно на страницу входа.
Это старый вопрос - но я недавно решил ту же проблему и придумал решение, которое гораздо более элегантно, чем:
devise_for :users, :skip => [:registrations] as :user do get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration' put 'users' => 'devise/registrations#update', :as => 'user_registration' endи он дает имена по умолчанию для именованных маршрутов (например,
cancel_user_registration) без излишней многословности.devise_for :users, skip: [:registrations] # Recreates the Devise registrations routes # They act on a singular user (the signed in user) # Add the actions you want in 'only:' resource :users, only: [:edit, :update, :destroy], controller: 'devise/registrations', as: :user_registration do get 'cancel' end
rake routesвыход с модулями devise по умолчанию:Prefix Verb URI Pattern Controller#Action new_user_session GET /users/sign_in(.:format) devise/sessions#new user_session POST /users/sign_in(.:format) devise/sessions#create destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy user_password POST /users/password(.:format) devise/passwords#create new_user_password GET /users/password/new(.:format) devise/passwords#new edit_user_password GET /users/password/edit(.:format) devise/passwords#edit PATCH /users/password(.:format) devise/passwords#update PUT /users/password(.:format) devise/passwords#update cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel edit_user_registration GET /users/edit(.:format) devise/registrations#edit user_registration PATCH /users(.:format) devise/registrations#update PUT /users(.:format) devise/registrations#update DELETE /users(.:format) devise/registrations#destroy
сделайте это в маршрутах.РБ
devise_for :users, :controllers => {:registrations => "registrations"}, :skip => [:registrations] as :user do get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration' put 'users' => 'devise/registrations#update', :as => 'user_registration' end devise_scope :user do get "/sign_in", :to => "devise/sessions#new" get "/sign_up", :to => "devise/registrations#new" endвы получите сообщение об ошибке теперь, когда вы пришли, чтобы войти в страницу, чтобы исправить это. Сделать такое изменение: приложение/просмотров/разработать/общая/_links.Эрб
<% if request.path != "/sign_in" %> <%- if devise_mapping.registerable? && controller_name != 'registrations' %> <%= link_to "Sign up", new_registration_path(resource_name) %><br /> <% end -%> <% end %>
мне понравилось @Макс ответ, но когда пытаюсь использовать его, я столкнулся с ошибкой из-за
devise_mappingбудучи Нил.Я немного изменил его решение, чтобы решить эту проблему. Это потребовало обертывания вызова на
resourceвнутриdevise_scope.devise_for :users, skip: [:registrations] devise_scope :user do resource :users, only: [:edit, :update, :destroy], controller: 'devise/registrations', as: :user_registration do get 'cancel' end endотметим, что
devise_scopeожидает особой:user, тогда какresourceожидает множественное число:users.
для других в моем случае.
Сdevise (3.5.2).
Я успешно удалил маршруты для регистрации, но сохранил те, чтобы редактировать профиль, со следующим кодом.#routes.rb devise_for :users, skip: [:registrations] as :user do get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration' put '/users(.:format)' => 'devise/registrations#update', as: 'user_registration' patch '/users(.:format)' => 'devise/registrations#update' end
я обнаружил, что это хорошо работает, не возясь с маршрутами или добавляя методы контроллера приложений. Мой подход заключается в том, чтобы переопределить разработать метод. Добавьте это в
app/controllers/devise/registrations_controller.rbЯ опустил другие методы для краткости.class Devise::RegistrationsController < DeviseController ... # GET /resource/sign_up def new redirect_to root_path end .... endкроме того, чтобы удалить иллюзию, что этот путь все еще доступен из других представлений, вы также можете удалить этот код из
app/views/devise/shared/_links.erb<%- if devise_mapping.registerable? && controller_name != 'registrations' %> <%= link_to "Sign up", new_registration_path(resource_name) %><br /> <% end -%>
вот немного другой маршрут я пошел. Это делает его так, что вам не придется переопределять
devise/shared/_links.html.erbвид.на
app/models/user.rb:devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatableна
config/routes.rb:devise_for :users devise_scope :user do put 'users' => 'devise/registrations#update', as: 'user_registration' get 'users/edit' => 'devise/registrations#edit', as: 'edit_user_registration' delete 'users' => 'devise/registrations#destroy', as: 'registration' endперед:
$ rake routes | grep devise new_user_session GET /users/sign_in(.:format) devise/sessions#new user_session POST /users/sign_in(.:format) devise/sessions#create destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy user_password POST /users/password(.:format) devise/passwords#create new_user_password GET /users/password/new(.:format) devise/passwords#new edit_user_password GET /users/password/edit(.:format) devise/passwords#edit PATCH /users/password(.:format) devise/passwords#update PUT /users/password(.:format) devise/passwords#update cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel user_registration POST /users(.:format) devise/registrations#create new_user_registration GET /users/sign_up(.:format) devise/registrations#new edit_user_registration GET /users/edit(.:format) devise/registrations#edit PATCH /users(.:format) devise/registrations#update PUT /users(.:format) devise/registrations#update DELETE /users(.:format) devise/registrations#destroyпосле:
$ rake routes | grep devise new_user_session GET /users/sign_in(.:format) devise/sessions#new user_session POST /users/sign_in(.:format) devise/sessions#create destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy user_password POST /users/password(.:format) devise/passwords#create new_user_password GET /users/password/new(.:format) devise/passwords#new edit_user_password GET /users/password/edit(.:format) devise/passwords#edit PATCH /users/password(.:format) devise/passwords#update PUT /users/password(.:format) devise/passwords#update user_registration PUT /users(.:format) devise/registrations#update edit_user_registration GET /users/edit(.:format) devise/registrations#edit registration DELETE /users(.:format) devise/registrations#destroy
у меня была та же проблема, и я обнаружил, что это немного плохая практика для перенаправления пользователей со страницы регистрации. Так что мое решение в основном не использует
:registrableна всех.то, что я сделал, это создать подобную страницу, Как редактировать данные пользователя, которые выглядели так:
<%= form_tag(update_user_update_path, method: :post) do %> <br> <%= label_tag(:currPassword, 'Current password:') %> <%= password_field_tag(:currPassword) %> <br> <%= label_tag(:newPassword, 'New password:') %> <%= password_field_tag(:newPassword) %> <br> <%= label_tag(:newPasswordConfirm, 'Confirm new password:') %> <%= password_field_tag(:newPasswordConfirm) %> <br> <%= submit_tag('Update') %> <% end %>таким образом, эта форма отправляет в новую конечную точку post, которая обновляет пароль, который выглядит следующим образом:
def update currPass = params['currPassword'] newPass1 = params['newPassword'] newPass2 = params['newPasswordConfirm'] currentUserParams = Hash.new() currentUserParams[:current_password] = currPass currentUserParams[:password] = newPass1 currentUserParams[:password_confirmation] = newPass2 @result = current_user.update_with_password(currentUserParams) endпозже вы можете использовать
@resultна ваш взгляд, чтобы определить пользователя пароль обновляется или нет.
изменение маршрутов есть целая куча других проблем, которые приходят с этим. Самый простой способ, который я нашел, это сделать следующее.
ApplicationController < ActionController::Base before_action :dont_allow_user_self_registration private def dont_allow_user_self_registration if ['devise/registrations','devise_invitable/registrations'].include?(params[:controller]) && ['new','create'].include?(params[:action]) redirect_to root_path end end end
вы можете изменить
deviseсам камень. Во-первых, выполните эту команду, чтобы найти установленное место использования:
gem which deviseпредположим, что путь:
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/deviseзатем перейдите к
/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise/lib/devise/railsредактироватьroutes.rbв этом каталоге. Существует метод под названиемdef devise_registration(mapping, controllers)что вы можете изменить, чтобы избавиться от новых действий. Вы также можете полностью удалить сопоставления дляdevise_registration
Comments