Обоснование рендера: new вместо redirect_to new для POST create? - PullRequest
1 голос
/ 13 февраля 2012

с учетом рельсов RESTful контроллера

class WidgetsController
  def new
    @widget = Widget.new
  end

  def create
    @widget = Widget.new(params[:widget])
    render :new and return unless w.save

    redirect_to widget_path(@widget)
  end
end

За исключением сбора параметров и отображения сообщений проверки, почему соглашение render :new вместо redirect_to new_widget_path в случае сбоя проверки?

Поскольку URL изменится с /widgets/new на /widgets, если проверка не пройдена, не нарушает ли это понятие REST?

Ответы [ 3 ]

2 голосов
/ 13 февраля 2012

Визуализация не вызовет действие контроллера, поэтому переменные экземпляра, которые вы установили в действии создания, будут перенесены в новое представление.

это означает, что все ошибки проверки сохраняются в новом представлении ...

redirect_to запустит действие контроллера для нового и, следовательно, создаст новый экземпляр вашей модели ... и вы потеряете ошибки ...

надеюсь, это поможет

1 голос
/ 03 февраля 2013

Не могли бы вы сделать это вместо рендеринга нового действия?

   flash[:thing] = params[:thing]
   redirect_to new_thing_path

Тогда в новом

   @thing = Thing.new(flash[:thing] || params[:thing])

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

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

Этот рельсизм всегда преследовал меня. Есть ли серьезные проблемы с этим, которые я не рассматриваю? Все ли другие платформы приложений делают то же самое?

0 голосов
/ 13 февраля 2012

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

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