Перенаправление при редактировании / обновлении пользователя (с ошибкой)

#ruby-on-rails #ruby-on-rails-3 #devise

#ruby-on-rails #ruby-on-rails-3 #разработать

Вопрос:

Я хочу обновить / отредактировать пользователя devise из моей собственной формы в моем проекте, но проблема в том, что я не могу перенаправить при обновлении «request.referer».

Я читал это, но у меня это не сработало: https://github.com/plataformatec/devise/wiki/How-To:-Customize-the-redirect-after-a-user-edits-their-profile …И другие вики-страницы.

Хорошо, итак, мой код:

 #/views/backend/perso.html.erb
<%= form_for(@user, :url => registration_path(@user), :html => { :method => :put }) do |f| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(form.errors.count, "error") %> prohibited this data from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
# Other fields ...
  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email %>
  </div>

  <div class="field">
    <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
    <%= f.password_field :current_password %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
  

Итак, пользователь находится на этой странице и обновляет свои данные. Проблема, я перенаправляюсь в / users/
Я пытался добавить это в маршруты:

 #config/routes.rb
devise_for :users do
    get "users", :to => "backend#perso", :as => :user_root # Rails 3
end
  

Или даже на контроллер приложения:

 #/controllers/application_controller.rb
private
def after_update_path_for(resource)
  backend_perso_path
end
  

Но все еще не работает.

Спасибо всем, кто пытается мне помочь!

Редактировать

Когда обновление не генерирует ошибки, я перенаправляюсь на нужную страницу (путем добавления after_update_path_for в моем контроллере приложений), но при наличии ошибок отображается /view /devise /registration /edit.html.erb

Обновить

Хорошо, итак, я перезаписал контроллер Devise следующим образом: https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password

Итак, мой код в registrations_controller выглядит следующим образом

 #controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
  def update
    # Devise use update_with_password instead of update_attributes.
    # This is the only change we make.
    if resource.update_attributes(params[resource_name])
      set_flash_message :notice, :updated
      # Line below required if using Devise >= 1.2.0
      sign_in resource_name, resource, :bypass => true
      redirect_to after_update_path_for(resource)
    else
      clean_up_passwords(resource)
      redirect_to backend_perso_path # That's the line I need to change
    end
  end
end
  

Теперь я могу перенаправить на нужную страницу, но я не знаю, как показать, что произошли ошибки!

Ответ №1:

простой ответ с помощью маршрутизации Rails извне В использовании «не совсем элегантного» жестко запрограммированного, user_root как описано в Как: Настроить перенаправление после того, как пользователь отредактирует свой профиль

 #config/routes.rb
match 'user_root' => redirect("/wherever/you/want")
  

Комментарии:

1. Как: Настроить перенаправление… ссылка предоставила информацию, которая мне помогла. На реализацию исправления ушло 5 секунд. Спасибо!

Ответ №2:

Я не получил никакого полезного ответа (хотя спасибо Laurent за ваше решение!), так что вот мой код на данный момент.

Выполняет работу, но не очень чисто.

 class RegistrationsController < Devise::RegistrationsController
  def update
    # Devise use update_with_password instead of update_attributes.
    # This is the only change we make.
    if resource.update_attributes(params[resource_name])
      set_flash_message :notice, :updated
      # Line below required if using Devise >= 1.2.0
      sign_in resource_name, resource, :bypass => true
      redirect_to after_update_path_for(resource)
    else
      clean_up_passwords(resource)
      redirect_to after_update_path_for(resource), :flash => { :alert => "Error message" }
    end
  end

  private
  # Redirect to the URL after modifying Devise resource (Here, our user)
  def after_update_path_for(resource)
    my_path
  end
end
  

Ответ №3:

Я не использую devise, но я сталкивался с аналогичной проблемой в omniauth. В OmniAuth есть метод referer или origin, но у меня он не работал для создания учетной записи. Итак, что я сделал, это грязный взлом, сохраняющий исходную страницу в переменной сеанса и проверяющий ее после выполнения действия.