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

UnS*_*per 6 routing routes ruby-on-rails

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

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

代替: http://mysite.com/forum/1/board/99/thread/321

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

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

这可能吗?

Rya*_*igg 5

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

def to_param
  permalink
end
Run Code Online (Sandbox Code Playgroud)

permalink由或许产生before_save

before_save :set_permalink

def set_permalink
  self.permalink = title.parameterize
end
Run Code Online (Sandbox Code Playgroud)

你创建一个永久链接的原因是,最终,也许,你可能会有一个不符合URL的标题.那是parameterize进来的地方.

现在,至于根据permalink你可以找到那些帖子,你可以选择简单的路线或艰难的路线.

轻松的路线

定义to_param略有不同:

def to_param
  id.to_s + permalink
end
Run Code Online (Sandbox Code Playgroud)

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

艰难的路线

保持to_param不变.诉诸使用find_by_permalink在你的控制器,使用params[:id]它在形式传递路线:

Model.find_by_permalink(params[:id])
Run Code Online (Sandbox Code Playgroud)

现在是有趣的部分

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

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

get ':forum_id/:board_id/:topic_id', :to => "topics#show", :as => "forum_board_topic"
Run Code Online (Sandbox Code Playgroud)