Совершенно новичок в Rails 3, и он все время гуглил безрезультатно, чтобы решить следующую проблему, при этом в большинстве руководств не хватает ошибок обработки.
Я создал проект Rails 3 с несколькими типами / моделями контента, такими как Статьи, Блоги и т. Д. Каждый тип контента имеет комментарии, все они хранятся в одной таблице Комментариев как вложенный ресурс и с полиморфными ассоциациями. Есть только одно действие для комментариев, действие «создать», потому что нет необходимости в показе и т. Д., Поскольку он принадлежит родительскому типу контента и должен просто снова отобразить эту страницу при отправке.
Теперь у меня есть большая часть этой работы, и комментарии отправляются и публикуются просто отлично, но последняя остающаяся проблема - это отображение ошибок, когда пользователь не заполняет обязательное поле. Если поля не заполнены, он должен вернуться на родительскую страницу и отобразить ошибки проверки, как это обычно делает Rails с MVC.
Действие создания моего контроллера комментариев выглядит следующим образом, и это то, что я впервые попробовал ...
def create
@commentable = find_commentable
@comment = @commentable.comments.build(params[:comment])
respond_to do |format|
if @comment.save
format.html { redirect_to(@commentable, :notice => 'Comment was successfully created.') }
else
format.html { redirect_to @commentable }
format.xml { render :xml => @commentable.errors, :status => :unprocessable_entity }
end
end
end
Когда вы ничего не заполняете и не отправляете форму комментариев, страница перенаправляется обратно к соответствующему родителю, но ни флэш, ни ничего не отображается. Теперь я выяснил, почему, насколько я понимаю, флэш-память не будет сохраняться в redirect_to, а только в рендере. Теперь вот в чем проблема.
В контроллере комментариев есть только действие «создать», поэтому мне нужно было указать рендер на «блоги / шоу» (ПРИМЕЧАНИЕ: я знаю, что это не полиморфно, но как только я получу эту работу, я буду беспокоиться об этом потом). Я пробовал это в блоке "else" приведенного выше кода ...
else
format.html { render 'blogs/show' }
format.xml { render :xml => @commentable.errors, :status => :unprocessable_entity }
end
В любом случае, когда я пытаюсь отправить недействительный комментарий в блог, я получаю сообщение об ошибке, в котором говорится: «Показано [...] / app / views / blogs / show.html.erb, где поднята строка # 1: неопределенный метод `title 'для nil: NilClass."
Глядя на URL, я думаю, что знаю, почему ... вместо того, чтобы указывать на / blogs / the-title-of-my-article (я использую friendly_id), он идет в / blogs / the-title- комментарии из-моя-статья /. Я полагаю, что дополнительные «комментарии» отбрасывают запрос и возвращают его ноль.
Так как я могу заставить страницу отображать без добавления дополнительных комментариев? Или есть лучший способ решить эту проблему?
Не уверен, имеет ли это значение или помогает, но route.rb для комментариев / блогов выглядит так ...
resources :blogs, :only => [:show] do
resources :comments, :only => [:create]
end