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