2017-01-17 2 views
0

Я запутался в форме Rails Guide об использовании формы для создания каждого комментария. Из docs я получаю, что вы обычно передаете имя объекта модели в качестве первого параметра в form_for, но как работает @article.comments.build? Как Rails знает, как построить форму для каждого комментария, который будет принадлежать статье? Документы не объясняют подпись, которая соответствует ценам нижеКак работает Rails для работы с вложенным ресурсом?

<%= form_for([@article, @article.comments.build]) do |f| %> 
+0

Если вы посмотрите на модель статьи, вы увидите, что на ней есть строка 'has_many: comments'. Если в таблице комментариев есть столбец в 'article_id', @ article.comments могут легко сопоставить комментарии этой конкретной статьи (поиск по статье_id). Не знаете, действительно ли это то, что вы искали. – DroidNoob

ответ

0

От Getting Started with Rails Tutorial:

<%= form_for([@article, @article.comments.build]) do |f| %> 
    <p> 
    <%= f.label :commenter %><br> 
    <%= f.text_field :commenter %> 
    </p> 
    <p> 
    <%= f.label :body %><br> 
    <%= f.text_area :body %> 
    </p> 
    <p> 
    <%= f.submit %> 
    </p> 
<% end %> 

Это добавляет форму на шоу странице статьи, которая создает новый комментарий, вызвав CommentsController создать действие. В вызове form_for используется массив, который будет строить вложенный маршрут, например/articles/1/comments.

Таким образом, он использует массив в качестве первого аргумента в form_for и выше раздел объяснил это так, что он будет строить вложенный маршрут как этот /articles/1/comments сказать вашему CommentsController, на котором статью должен быть создан этот комментарий.

0

Здесь полная роль, если routes и controller. Давайте посмотрим, из запуска:

Ваш маршрут говорит:

resources :articles do 
    resources :comments 
end 

Так, чтобы создать comments ваш маршрут будет как: /articles/1/comments так это означает, что comment для Article с id: 1.

Теперь в контроллере ваши create действия, как это:

def create 
    @article = Article.find(params[:article_id]) 
    @comment = @article.comments.create(comment_params) 
    redirect_to article_path(@article) 
end 

Так здесь вы можете видеть, что мы находим в @article с помощью params[:article_id] который приходит от url. Таким образом, это вернет 1 и @article будет иметь объект Article с id: 1. А затем в следующей строке вы создаете @comment вроде этого:

@comment = @article.comments.create(comment_params) 

Так что это создаст Comment, который будет принадлежать Article с id: 1.

Теперь речь идет о form_for и сомнения у вас есть:

<%= form_for([@article, @article.comments.build]) do |f| %> 

Это ничего не делает это будет просто создать form, который представит нужный адрес, который article/:id/comments с POST запроса. Таким образом, если вы нажмете на этот маршрут, он идентифицирует, что вам необходимо создать этот Comment для Article.

Если что у вас есть маршрут, как это:

resources :comments 

Тогда createComment вы будете ударять маршрут /comments, который никогда не будет знать, что принадлежит к Article, пока вы не отправить article_id явно.

Смежные вопросы