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