Для чего нужны вложенные маршруты в Rails?

Я новичок в изучении Rails и только что столкнулся с вложенными маршрутами. Пример, на который я смотрю, включает статьи и комментарии в блогах. Я пытаюсь понять, в чем преимущество вложенных маршрутов в Rails.

Насколько я могу судить, вся информация, содержащаяся во вложенном маршруте для комментария, такого как /articles/:article_id/comments/:id(.:format), содержится в самом объекте комментария, поэтому он не передает дополнительную информацию действию.

Почему бы просто не использовать невложенные маршруты, такие как /comments/:id(.:format)?

Очевидно, есть очень веская причина для использования вложенных маршрутов, но я не смог ее решить. Единственное преимущество, которое я вижу на данный момент, это то, что это дает лучшую иллюстрацию связи между статьями и комментариями при чтении URL-адреса, но вся эта информация в любом случае содержится в объекте комментария.

Может ли кто-нибудь объяснить это?


person Cu1ture    schedule 09.08.2014    source источник


Ответы (2)


В вашей модели вы бы установили эту ассоциацию

class Article< ActiveRecord::Base
  has_many :comments
end

class Comment< ActiveRecord::Base
  belongs_to :article
end

Итак, каждый комментарий связан со статьей, и вам нужна некоторая логика, чтобы найти соответствующую статью для комментария

Здесь в дело вступает вложенный маршрут, позволяющий найти статью для этого комментария в действии вашего контроллера. Если вы снова посмотрите на этот маршрут

/articles/:article_id/comments/:id(.:format)

Это контроллеры комментариев показывают действие, и этот маршрут позволяет вам найти как статью, так и ваш комментарий внутри действия показа.

def show
  @article = Article.find(params[:article_id])
  @comment = Comment.find(params[:id])
  # if you are not using nested routes then you can find out associated article by
  @article = @comment.article # but you'll have to query your database to get it which you can simply find if you are using nested route
end

Больше, чем действие показать (где вы можете использовать другую логику для поиска статьи, связанной с этим комментарием) вам нужен вложенный маршрут для вашего нового действия, где вы должны найти эту статью, а затем создать комментарий к этой статье чем-то вроде

def new
  @article = Article.new
  @comment = @article.comments.build
end

Как указывал @August, вы можете отделить действия, для которых вы хотите, чтобы ваш маршрут был вложенным, с помощью неглубокого вложения, вы можете сделать:

resources :articles do
  resources :comments, shallow: true
end

Оформить заказ nested routes для получения дополнительной информации.

person Mandeep    schedule 09.08.2014

Правильно, наличие article в пути избыточно при работе с ранее существовавшим comment (потому что вы можете получить article из comment). Чтобы избежать этого, вы можете использовать shallow маршруты:

#routes.rb

resources :articles, shallow: true do
  resources :comments
end

# or use a `shallow` block
shallow do
  resources :articles
    resources :comments
  end
end
person August    schedule 09.08.2014