Rails-Devise-редактировать путь регистрации пользователя
с Rails есть путь, edit_user_registration_path, чтобы позволить пользователям редактировать свой профиль.
я настраиваю свой собственный контроль учетных записей, чтобы представить пользователю лучший пользовательский интерфейс для редактирования их профиля и т. д.. который направляется по адресу / account / profile, / account / notices и т. д....
проблема в этом URL,/users / edit все еще работает и принимает пользователей на страницу редактирования DEVISE.
Как я могу всегда переходить на новую страницу редактирования / аккаунт / Профиль
спасибо
4 ответов
это, вероятно, худшая часть о devise делает пользовательский путь редактирования профиля. Причина этого в том, что при попытке обновить ресурс он отправит вас обратно в путь по умолчанию для редактирования пользователя, то есть если вы получите ошибки.
Я бы предложил вам сохранить путь пользователей/редактирования по умолчанию, а затем редактировать ассоциации, а не фактические ресурсы. В противном случае вам придется копаться в драгоценном камне и переписывать пути того, как пользователи отредактированный.
вот что я сделал.
в вашей модели пользователя user.rb
has_one :profile
has_many :notices
тут вы можете notices
и profiles
контроллер, где вы редактируете те, а не пользователь или resource
что вы сделали с помощью помощников devise и затруднит настройку. Сделать hidden_field f.hidden_field :user_id, :value => current_user.id
для этих форм, и он сохранит пользователя при их создании и обновлении и т. д...
по состоянию на последнюю версию Devise (в частности этот коммит), теперь вы можете указать пользовательский путь для действия Редактировать профиль через path_names
:
devise_for :users, path_names: { edit: 'profile' }
более простой способ-просто создать ProfilesController, и в ваших маршрутах просто определите "resource :profile". Затем вы просто определяете методы" редактировать "и" обновлять", и все готово.
Я не пошел дальше основ, но я действительно не вижу обратной стороны, и это действительно просто по сравнению со всем, что было предложено здесь.
устранение:
def update
self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)
if update_resource(resource, account_update_params)
yield resource if block_given?
if is_flashing_format?
flash_key = update_needs_confirmation?(resource, prev_unconfirmed_email) ?
:update_needs_confirmation : :updated
set_flash_message :notice, flash_key
end
sign_in resource_name, resource, :bypass => true
respond_with resource, :location => after_update_path_for(resource)
else
clean_up_passwords resource
#Add a conditional redirect depending on where the controller was called from
if URI(request.referer).path == '/users/edit'
respond_with resource
else
redirect_to after_update_path_for(resource), :flash => { :alert => "Please enter your password" }
end
end
end