2

我要支持:

POST images/1/comments/2/like

POST 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零件时,我怎么能呢?

4

4 回答 4

2

其实你可以让它更漂亮。根据http://ruby-journal.com/how-to-dry-your-rails-routes/,这也有效:

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

resources :comments, &comments

resources :images do
  comments.call
end

在 Rails 4 中你可以使用关注点

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

于 2015-03-29T10:08:23.793 回答
1

我会考虑重新设计哪些 RESTful 路由Comment正在嵌套,哪些不是。我假设您的模型看起来像这样:

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

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

因为您ImageComment模型具有一对多的关系,所以我可以理解为什么您会考虑将评论资源路由嵌套在图像之一中。但是,在 中的所有 CRUD 操作中comments_controller.rb,实际上create 需要显式传入父图像 ID。从 RESTful 角度来看,只有newandcreate操作需要将 aimage_id传递给操作。、editupdate和动作deletelike可以独立于父图像发生。

请考虑替代路由示意图:

# config/routes.rb
resources :images do
  resources :comments, :only => [:index, :new, :create]
end

resources :comments, :only => [:show, :edit, :update, :destroy] do
  member do
    post 'like'
  end
end

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

于 2013-06-13T08:37:30.377 回答
0

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

于 2013-06-13T08:14:33.777 回答
0

不知道有比在下面重复这个更漂亮的方法:

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
于 2013-06-13T08:16:43.153 回答