Отобразить действие, которое инициировало обновление - PullRequest
5 голосов
/ 06 марта 2011

У меня есть SettingsController с действиями учетная запись и профиль , а также обновление , которое выглядит как:

  def update
    @player = current_user
    if @player.update_attributes(params[:player])
      flash[:success] = "Profile updated."
      redirect_to :back
    else
      @title = "Edit"
      render
    end
end

Теперь каждому из профилей и действий учетной записи соответствует представление с формой для редактирования некоторых записей модели Player.

Когда вы пытаетесь сохранить одну из этих форм, и она терпит неудачу, т.е. он не прошел проверку, он должен отобразить действие, которое снова инициализировало обновление , чтобы он мог отображать соответствующие сообщения об ошибках.

Но проблема в том, как узнать, кто из них запросил обновление, и как правильно отрендерить? По сути, я ищу здесь своего рода эквивалент redirect_to: back.

Ответы [ 2 ]

18 голосов
/ 06 марта 2011

Это уродливо, но работает:)

render Rails.application.routes.recognize_path(request.referer)[:action]
0 голосов
/ 06 марта 2011

Обычно это можно исправить, применив шаблон:

def edit
  @title = "Edit"

  # ...
end

def update
  # Update using the exception-generating variant
  @player.update_attributes!(params[:player])

  # ... More actions if successful

rescue ActiveRecord::RecordInvalid
  self.edit
  render(:action => 'edit')
end

Это часто упрощается, если иметь before_filter, который обрабатывает загрузку экземпляра модели для вас.

Посколькуэто может быть использовано много, иногда вы можете заключить это в метод делегирования:

def fallback_render(action)
  send(action)
  render(:action => action)
end
...