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

时间:2010-04-04 18:37:56

标签: ruby-on-rails routing routes

我了解如何在Rails中创建虚荣URL以进行翻译 http://mysite.com/forum/1进入http://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

这可能吗?

3 个答案:

答案 0 :(得分:5)

要使用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找到这些帖子,您可以选择简单的路线或艰难的路线。

轻松路线

稍微不同地定义to_param

def to_param
  id.to_s + permalink
end

继续使用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])

现在有趣的部分

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

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

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

答案 1 :(得分:2)

答案 2 :(得分:1)

也许尝试类似

的内容
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) %>

我希望这会有所帮助

相关问题