Ruby on rails rails路由嵌套资源重复

Ruby on rails rails路由嵌套资源重复,ruby-on-rails,ruby,Ruby On Rails,Ruby,我要支持: POST images/1/comments/2/like 及 它们都指向具有相同操作的相同资源。如何在rails路由文件中实现这一点 resources :images do resources :comments do member do post 'like' end end end 这对我有用 POST images/1/comments/2/like 但是当我没有指定images/1部分时,我该如何处理呢

我要支持:

POST images/1/comments/2/like

它们都指向具有相同操作的相同资源。如何在rails路由文件中实现这一点

  resources :images do
    resources :comments do
      member do
        post 'like'
      end
    end
  end
这对我有用

POST images/1/comments/2/like

但是当我没有指定
images/1
部分时,我该如何处理呢?

只需添加
资源:images
它可能会起作用

我不确定是否有比重复下面的方法更漂亮的方法:

resources :comments do
  member do
    post 'like'
  end
end
像这样:

resources :images do
  resources :comments do
    member do
      post 'like'
    end
  end
end

resources :comments do
  member do
    post 'like'
  end
end

<>我会考虑修改<代码> >注释< /代码>的休止路由,嵌套,而不是。我假设你的模型是这样的:

# app/models/image.rb
class Image < ActiveRecord::Base
    has_many :comments
end

# app/models/comment.rb
class Comment < ActiveRecord::Base
    belongs_to :image
end

现在,只有显式依赖于父ID的注释操作实际上嵌套在图像路由中。其余的注释操作将直接路由到注释控制器,而无需传递父ID。您的路由不再重复,并且每个操作将只声明一个路由。

您可以让它更漂亮。据了解,这也适用于:

comments = Proc.new do
  member do
    post 'like'
  end
end

resources :comments, &comments

resources :images do
  comments.call
end
在Rails4中,您可以使用关注点

concern :comments_concern do
  member do
    post 'like'
  end
end

resources :comments, concerns: :comments_concern

resources :images, concerns: :comments_concern do
  #do more stuff here
end
我没有测试这个,但它可能会有帮助。看看上面提到的网站。祝你好运


-frbl

感谢您的详细回复/解释!当然。希望一切都有意义。基本上,确保每个操作只有一个路由可以使应用程序保持干燥,并且不需要在从多个源路由到的操作中添加一系列条件来处理参数。这有点晚了,但是……索引/新建/创建注释资源的路径不包括图像的id,而只包括是否将其包含在参数中?因此,不要说images/1/comments,而是说comments/1?image_id=5。哪一个更安静?谢谢两者都是可以接受的,不过Rails的惯例是要有友好的URL。首先,它们更具语义,其次,搜索引擎更容易为它们编制索引。但这取决于你怎么做。当然,Rails默认会生成友好的URL,因此从易于使用的角度来看,遵守约定可能比抽象一种新的URL映射方式更容易。谢谢,但是当你说“他们”时,你指的是哪一种呢?是“图片/1/评论”吗?
comments = Proc.new do
  member do
    post 'like'
  end
end

resources :comments, &comments

resources :images do
  comments.call
end
concern :comments_concern do
  member do
    post 'like'
  end
end

resources :comments, concerns: :comments_concern

resources :images, concerns: :comments_concern do
  #do more stuff here
end