Я использую 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: ''
}
источник
https://example.com/users/
. Смотрите мой ответ ниже.Ответы:
Я тоже пытался это сделать, но кто- то из группы разработчиков Google отговорил меня от поиска действительно чистого решения.
Я процитирую Хосе Валима (сопровождающего Devise):
Первоначальный вопрос был:
источник
:skip => :registrations
не так:skip => :registerable
.Вы можете сделать это в вашей модели
измените это на:
обратите внимание, что символ
:registerable
был удаленВот и все, больше ничего не требуется. Все маршруты и ссылки на страницу регистрации тоже волшебным образом удалены.
источник
edit_user_registration
, который мне нужен. Как я уже сказал, «они все еще должны иметь возможность редактировать свои профили».localhost:3000/admin
где они могут редактировать свою учетную запись, даже если удаленный объект удален. Если это не жизнеспособное решение, взгляните на CanCan, который позволяет определить, кто может и не может получить доступ к ресурсу. Я склонен добавлять роли типа «администратор» или «модератор» и блокировать всех остальных на страницах регистрации.sign_in
в производстве?У меня была похожая проблема, пытался удалить devise_invitable пути для создания и новых :
перед:
грабли маршруты
после
грабли маршруты
Примечание 1 Разработать область действия https://github.com/plataformatec/devise#configuring-routes
заметка 2 Я применяю его на devise_invitable, но он будет работать с любой функцией devise *
Важное примечание: видите, что devise_scope не для пользователей, а для пользователей ? это верно, остерегайтесь этого! Это может причинить вам много боли:
источник
Я нашел другой пост похожий на этот, и хотел бы поделиться ответом, который дал @chrisnicola. В посте они пытались заблокировать только регистрацию пользователей во время производства.
Вы также можете изменить контроллер регистрации. Вы можете использовать что-то вроде этого:
В "app / controllers / registrations_controller.rb"
Это переопределит контроллер devise и будет использовать вышеописанные методы. Они добавили флеш-сообщения, если кто-то каким-то образом попал на страницу sign_up. Вы также должны иметь возможность изменить перенаправление на любой путь, который вам нравится.
Также в «config / rout.rb» вы можете добавить это:
Оставив это так, вы сможете использовать стандартное устройство для редактирования своего профиля. Если вы хотите, вы все равно можете изменить параметр редактирования профиля, включив
в "app / controllers / registrations_controller.rb"
источник
Это старый вопрос, но недавно я решил ту же проблему и придумал решение, которое намного элегантнее, чем:
И это дает имена по умолчанию для именованных маршрутов (например
cancel_user_registration
), не будучи слишком многословным.rake routes
вывод с модулями разработки по умолчанию:источник
Вы можете переопределить «devise_scope», поместив его перед «devise_for».
Не уверен, что это лучший способ, но это мое решение в настоящее время, так как он просто перенаправляет обратно на страницу входа.
источник
/users/sign_up
то вы будете доступ кsites#index
неsign_up
только адрес все еще остается/users/sign_up
.Мне понравился ответ @ max , но при попытке его использовать я столкнулся с ошибкой из-за того,
devise_mapping
что был нулевым.Я слегка изменил его решение, чтобы решить проблему. Требовалось завернуть звонок
resource
внутрьdevise_scope
.Обратите внимание, что
devise_scope
ожидает единственного числа,:user
тогда какresource
ожидает множественного числа:users
.источник
Сделайте это вways.rb
Вы получите ошибку сейчас, когда заходите на страницу входа, чтобы исправить ее. Сделайте это изменение в: app / views / devise / shared / _links.erb
источник
devise_for
иas
блок), и мне пришлось удалить:registerable
в модели.Я обнаружил, что это работает хорошо, не путаясь с маршрутами и не добавляя методы контроллера приложений. Мой подход заключается в переопределении метода разработки. Добавьте это к тому,
app/controllers/devise/registrations_controller.rb
что я опускаю другие методы для краткости.Также, чтобы убрать иллюзию, что этот путь все еще доступен из других представлений, вы также можете удалить этот код из
app/views/devise/shared/_links.erb
источник
Для других в моем случае.
С
devise (3.5.2)
.Я успешно удалил маршруты для регистрации, но сохранил те, которые редактировали профиль, со следующим кодом.
источник
Вот немного другой маршрут, по которому я пошел. Это делает его таким, что вам не нужно переопределять
devise/shared/_links.html.erb
вид.В
app/models/user.rb
:В
config/routes.rb
:Перед:
После:
источник
devise_for :users, skip: :all
У меня была та же проблема, и я нашел немного плохой практикой перенаправлять пользователей со страницы регистрации. Таким образом, мое решение в основном не использует
:registrable
вообще.То, что я сделал, было создать похожую страницу, например, редактировать пользовательские данные, которые выглядели так:
Таким образом, эта форма отправляет в новую конечную точку сообщения, которая обновляет пароль, который выглядит следующим образом:
Позже вы можете использовать, по
@result
вашему мнению, информацию о том, обновлен пароль или нет.источник
При изменении маршрутов возникает целый ряд других проблем. Самый простой метод, который я нашел, это сделать следующее.
источник
Вы можете изменить сам
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
источник
gem 'devise', github: 'yourusername/devise', branch: "master"
)