如何在rails中实现“短”嵌套虚荣URL?
我理解如何在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/forum/1/board/99/thread/321
我想在第一步得到这样的东西: http://mysite.com/1/99/321
: http://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) %>
我希望这有帮助