Здесь полная роль, если 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
Тогда create
Comment
вы будете ударять маршрут /comments
, который никогда не будет знать, что принадлежит к Article
, пока вы не отправить article_id
явно.
Если вы посмотрите на модель статьи, вы увидите, что на ней есть строка 'has_many: comments'. Если в таблице комментариев есть столбец в 'article_id', @ article.comments могут легко сопоставить комментарии этой конкретной статьи (поиск по статье_id). Не знаете, действительно ли это то, что вы искали. – DroidNoob