Как сделать рендер: изменить вызов показать / изменить в адресной строке - PullRequest
2 голосов
/ 28 июля 2010

В действии обновления моего контроллера предпочтений в моем приложении Rails, если есть какие-либо ошибки в проверке / сохранении и т. Д., Есть вызов:

format.html { render :edit }

Ничего необычноготам - однако при нажатии этого кода адрес в браузере изменяется и теряет / edit в URL.

Например:

Для начала мой браузер показывает, что я нахожусь на странице по следующему адресу: http://localhost:3000/preferences/1/edit

Однако, как только обнаруживаются ошибки и отображаетсяназывается адрес в изменился на http://localhost:3000/preferences/1

Я не могу сказать, что я когда-либо замечал это поведение раньше - но есть ли способ заставить / edit остаться в конце URL?Без / edit он эффективно показывает URL страницы показа (а у меня нет шаблона для этого!)

Большое спасибо, Эш

Ответы [ 2 ]

5 голосов
/ 28 июля 2010

Вместо вызова render вы можете redirect_to страницу редактирования и использовать flash для отслеживания модели:

def update
  # ...
  if !@model.save # there was an error!
    flash[:model] = @model
    redirect_to :action => :edit
  end
end

А затем в действии edit вы можетеперезагрузите значения из flash[:model], то есть:

def edit
  if flash[:model]
    @model = flash[:model]
  else
    @model = ... # load model normally
  end
end

Обновление:

Как прокомментировано ниже, я думаю, что когда я писал этот ответ, я пытался предоставить способ как обновить URL(что требует перенаправления) и сохранить измененные атрибуты модели, поэтому модель была сохранена во флэш-памяти.Однако вставлять модель во флэш-память - довольно плохая идея (и в более поздних версиях Rails она все равно будет десериализована), и для маршрутов RESTful не требуется, чтобы URL содержал edit.

Обычным шаблоном было бы просто отобразить действие редактирования с моделью, уже находящейся в памяти, и отказаться от «идеального» URL:

def update
  # Assign attributes to the model from form params
  if @model.save
    redirect_to action: :index
  else
    render :edit
  end
end

В качестве альтернативы, если предпочтительнее иметь «идеальный» URL ивам не нужно поддерживать измененные атрибуты, которые не прошли проверку, см. ответ @ jamesmarkcook.

0 голосов
/ 05 января 2017

Просто перенаправьте на путь редактирования и передайте модель помощнику пути рельсов следующим образом:

def update
  if @model.update_attributes(updated_params)
    // Success
  else
    redirect_to edit_model_path(@model), flash: { error: "Could not update model" }
  end
end

Это сохранит ваш флеш, перенаправит вас на правильный путь и перезагрузит вашу модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...