我了解如何在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
。
这可能吗?
答案 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) %>
我希望这会有所帮助