У меня есть вопрос с двумя частями о form_for и вложенных ресурсах. Скажем, я пишу механизм блога, и я хочу связать комментарий со статьей. Я определил вложенный ресурс следующим образом:
map.resources :articles do |articles|
articles.resources :comments
end
Форма комментария находится в представлении show.html.erb для статей, под самой статьей, например, как это:
<%= render :partial => "articles/article" %>
<% form_for([ :article, @comment]) do |f| %>
<%= f.text_area :text %>
<%= submit_tag "Submit" %>
<% end %>
Это дает ошибку, "Названный идентификатором для ноля, который был бы по ошибке и т.д.". Я также попробовал
<% form_for @article, @comment do |f| %>
Который представляет правильно, но связывает f.text_area с 'текстовым' полем статьи вместо комментария и представляет HTML для атрибута article.text в той текстовой области. Таким образом, у меня, кажется, есть эта несправедливость также. То, что я хочу, является формой, чья 'отправляют', назовет действие по созданию на CommentsController, с article_id в параметрических усилителях, например, запрос сообщения к/articles/1/comments.
Вторая часть к моему вопросу, что лучший способ состоит в том, чтобы создать экземпляр комментария для начала? Я создаю @comment в выставочном действии ArticlesController, таким образом, объект комментария будет в объеме для form_for помощника. Затем в действии по созданию CommentsController, я создаю новый @comment с помощью параметрических усилителей, переданных в от form_for.
Спасибо!
Тебе не нужно делать особые вещи в форме. Вы просто правильно строите комментарий в действии шоу:
class ArticlesController < ActionController::Base
....
def show
@article = Article.find(params[:id])
@new_comment = @article.comments.build
end
....
end
и затем создайте форму для него в виде статьи:
<% form_for @new_comment do |f| %>
<%= f.text_area :text %>
<%= f.submit "Post Comment" %>
<% end %>
по умолчанию, этот комментарий перейдет к действию создания
действия CommentsController
, в которое вы, вероятно, захотите поместить redirect :back
, так что вы будете перенаправлены обратно на страницу Article
.