Почему метод рендеринга меняет путь для отдельного ресурса после редактирования? - PullRequest
4 голосов
/ 18 декабря 2010

ОК, поэтому у меня есть Пользователь , который имеет_он Шаблон , и я хочу страницу, которая в основном представляет собой просто представление редактирования Шаблон .

У меня есть:

class TemplatesController < ApplicationController
  def edit
    @template = current_user.template
  end

  def update
    @template = current_user.template
    if @template.update_attributes(params[:template])
      flash[:notice] = "Template was successfully updated"
    end
    render :edit 
 end

конец

Теперь проблема в том, что когда я вызываю render: edit, я фактически получаю /template.1 вместо / template / edit, что я и ожидал. Очевидно, что если я вызову redirect_to: edit, я получу ожидаемый путь, но потеряю ошибки объекта, если они были.

Есть ли лучший способ сделать это?

Спасибо !!

Ответы [ 3 ]

2 голосов
/ 18 декабря 2010

Обычно в паре действий редактирования / обновления вы рендерите правку из обновления только в случае ошибок, соответственно настраивая вспышку.Если вы уже работали с шаблоном / 1 / edit (что я и ожидал), то логически URL-адрес не изменится, поскольку вы говорите браузеру просто отобразить текст, который вы отправляете.Это ожидаемое поведение.Если обновление прошло успешно, вы можете перенаправить на показ или индексирование или куда угодно, и флэш-память сохранит текст уведомления (для этого нужна флэш-память), даже если модель этого не сделает.Обратите внимание, что для действия рендеринга необходимо использовать Flash.now, чтобы сообщение не сохранялось при следующем перенаправлении.

def update
  @template = current_user.template
  if @template.update_attributes(params[:template])
    flash[:notice] = "Template was successfully updated"
    redirect_to(@template)
  else 
    flash.now[:error] = @template.errors[:base]
    render :edit
  end
end
1 голос
/ 05 марта 2018

Если вы используете отдельный ресурс, вы хотите использовать resol * в ваших маршрутах. См. в Руководствах по Rails .

resource :geocoder
resolve('Geocoder') { [:geocoder] }
0 голосов
/ 18 декабря 2010

по моему мнению, вы не можете потерять объект шаблона (при действии редактирования), потому что вы получаете его от модели пользователя

render edit_template_patch(@template)

, и вы получите template/:id/edit например.template/1/edit

...