如何在rails中实现“短”嵌套虚荣URL?

我理解如何在Rails中创建一个虚荣URL,以便将http://mysite.com/forum/1翻译成http://mysite.com/some-forum-name

但我想更进一步,并进行以下工作(如果可能的话):

而不是: http://mysite.com/forum/1/board/99/thread/321http://mysite.com/forum/1/board/99/thread/321

我想在第一步得到这样的东西: http://mysite.com/1/99/321http://mysite.com/1/99/321

并最终拥有它像http://mysite.com/some-forum-name/some-board-name/this-is-the-thread-subject

这可能吗?

要使用Rails URL帮助程序“很好地”工作,您必须覆盖模型中的to_param

 def to_param permalink end 

permalink可能是由before_save生成的

 before_save :set_permalink def set_permalink self.permalink = title.parameterize end 

你创建一个固定链接的原因是,最终,也许,你可能会有一个不符合URL的标题。 这就是parameterize用武之地。

现在,至于根据permalink找到这些post,你可以选择简单的路线或艰难的路线。

轻松的路线

定义to_param略有不同:

 def to_param id.to_s + permalink end 

继续使用Forum.find(params[:id]) ,其中params[:id]将是1-my-awesome-forum 。 为什么这仍然有效? 好吧,Rails会在传递给find的参数上调用to_i ,并且在该字符串上调用to_i将只返回1

艰难的路线

保持to_param相同。 尝试在控制器中使用find_by_permalink ,使用从路径传递的params[:id]

 Model.find_by_permalink(params[:id]) 

现在是有趣的部分

现在您想从URL中取出资源。 嗯,这是一种Sisyphean方法。 当然你可以停止使用Ruby on Rails提供的路由助手,例如map.resources并使用map.connect定义它们但是它真的值得获得多少收益吗? 它授予你什么“特殊超能力”? 没有,我很害怕。

但是如果你想这样做,这里是一个很好的起点:

 get ':forum_id/:board_id/:topic_id', :to => "topics#show", :as => "forum_board_topic" 

从Outside In指南看一下Rails路由 。

也许尝试类似的东西

 map.my_thread ':forum_id/:board_od/:thread_id.:format', :controller => 'threads', :action => 'show' 

然后在你的控制器中

 @forum = Forum.find(params[:forum_id]) @board = @forum.find(params[:board_id]) @thread = @board.find(params[:thread_id]) 

请注意,您可以将model_id设为任何内容(在本例中为名称)

在您看来,您可以使用

 <%= link_to my_thread_path(@forum, @board, @thread) %> 

我希望这有帮助