Где рендерить комментарии контроллера в Rails при сбое валидации модели? - PullRequest
8 голосов
/ 03 марта 2011

У меня есть простая модель видео в моем приложении rails, которая has_many комментирует.Я показываю эти комментарии на странице показа видео.Когда я отправляю форму все работает нормально;однако, если в модели Comment есть ошибки проверки, моя система разрушается.Если в модели комментариев есть ошибки проверки, я просто хотел бы снова отобразить страницу показа видео с отображением стиля ошибок проверки.Как мне сделать это внутри моего действия создания?Большое спасибо!

class CommentsController < ApplicationController
  def create
    @video = Video.find(params[:video_id])
    @comment = @video.comments.build(params[:comment])
    if @comment.save
      redirect_to @video, :notice => 'Thanks for posting your comments.'
    else
      render # what? What do I render in order to show the video page's show action with the validation error styling showing? Please help!
    end
  end
end

Ответы [ 2 ]

10 голосов
/ 03 марта 2011

Для этого вам нужно будет отобразить шаблон:

class CommentsController < ApplicationController
  def create
    @video = Video.find(params[:video_id])
    @comment = @video.comments.build(params[:comment])
    if @comment.save
      redirect_to @video, :notice => 'Thanks for posting your comments.'
    else
      render :template => 'videos/show'
    end
  end
end

Имейте в виду, что вам нужно будет объявить любые переменные экземпляра (например, @video) внутри CommentsController # создать действие какхотя, поскольку действие VideosController # show не будет выполнено, шаблон будет просто отображен.Например, если у вас есть переменная @video_name в вашем действии VideosController # show, вам придется добавить ту же переменную экземпляра @video_name в действие CommentsController # create.

7 голосов
/ 03 января 2012

У меня такая же проблема. Я думаю, что ваш вопрос является дубликатом проверки Rails с перенаправлением (а также дублирован совсем недавно пользовательских ошибок проверки формы из контроллера внутри других родительских контроллеров 3.1 ).

Проблема с вышеупомянутым решением Pan Thomakos состоит в том, что если в VideosController#show содержится больше, чем нетривиальное количество кода, то вы не сможете выполнить рендеринг из шаблона videos/show без нарушения правила DRY. Вот обсуждение .

Этот пост Райана Бейтса о славе Railscasts предполагает, что вы можете сохранить @video во флэш-памяти, чтобы сохранить его при перенаправлении; однако, когда я пытаюсь сделать это, он выходит на другую сторону как экземпляр правильного класса, но у него нет ни одного из ожидаемых суперклассов - самое главное ActiveRecord::Base. Сначала я подумал, что, возможно, его совет просто устарел (он был написан в 2006 году). Тем не менее, один из ответов на Проверка Rails через перенаправление , написанный в октябре 2009 г., поддерживает тот же подход, хотя и с помощью пользовательского метода clone_with_errors, который принимает поверхностную копию экземпляра модели, чтобы избежать проблем с более глубокими объекты. Но даже при таком подходе любые методы, основанные на суперклассах, не работают. Я предполагаю, что это является следствием сериализации объекта во флэш-память, а затем десериализации из него.

Я нашел страницу , написанную в 2007 году, которая выступает против сохранения экземпляров модельных объектов в сеансе .

Я также нашел хороший аргумент в группе Google Formtastic, указывающий, что перенаправление при сбое проверки не является Rails Way , и, вероятно, плохой идеей. Но это все еще не дает хорошего решения в случае, когда задействованы несколько контроллеров. Возможно, Ячейки могут быть использованы для решения проблемы СУХОЙ, упомянутой выше.

В противном случае, я думаю, что единственный ответ - придерживаться простых данных, таких как идентификаторы объектов, строки сообщений об ошибках и т. Д.

...