Rails路由,深度嵌套外部资源

时间:2013-09-21 18:41:47

标签: ruby-on-rails rails-routing

我理解,只在URL中包含确定模型对象所需的参数是一种很好的做法。 如果我有2个模型,发布和评论...帖子有很多评论,评论属于一个帖子。评论的URL可以是

/comment/:comment_id

从协会我可以确定它属于哪个帖子但是 一些rails应用程序需要访问外部资源(例如通过API)。如果rails应用程序需要复制另一个外部源的一部分,那么处理URL和路由的正确方法是什么? 例如,如果帖子有一些评论,则评论的URL可以是

/post/:post_id/comment/:comment_id

/comment/:comment_id 

后者有一个缺点,即如果外部源的API没有确定,那么我无法确定它属于哪个帖子,这会导致在应用程序中导航时遇到一些问题,但这是一个简短的URL和允许用户轻松操纵URL以获得另一个评论(我认为这是一个优势)。同时使用第一个(长)链接会使URL这么长,但我可以知道它属于哪个帖子。

我能想到的唯一解决方案是使两者都成为可能,但如果我将长的一个设为默认值,则用户永远不会知道短的存在。你觉得怎么样?

1 个答案:

答案 0 :(得分:0)

我自己总是使用更长/拼写的版本。我不介意它很长,我只能看到好东西来自它,因为你在这里发现。我也认为这是一个优势因为你可以做这样的事情:

post = Post.find_by_id(params[:post_id])
comment = post.comments.find_by_id(params[:id])

关键是你不能以这种方式去“comment钓鱼”。您必须拥有正确的post上下文才能获得特定的comment。如果评论根本不敏感,这可能并不重要,但Web应用程序中可能有很多内容。因此,根对象(如post此处)的范围查找允许快速权限检查,可以重复使用,而无需检查父对象。

无论如何,这是我的2美分。我永远不明白为什么人们会对更长的网址进行冒犯。如果他们为你工作,那就不要害怕使用它们!