将路由密钥ID从/ threads / ID更改为/ threads / uuid

时间:2011-07-10 00:28:19

标签: ruby-on-rails ruby-on-rails-3

我有一个线程模型,它有Thread(id,uuid,title ...)

这是路径:

当控制器重定向时:http://localhost:3000/threads/828b9a2ffc

在日志中,我看到:

Started GET "/threads/828b9a2ffc" for 127.0.0.1 at Sat Jul 09 17:24:02 -0700 2011
  Processing by ThreadsController#show as HTML
  Parameters: {"id"=>"828b9a2ffc"}

这里的问题是我不希望828b9a2ffc成为ID,我希望它在参数中作为uuid进行interpruted,所以我应该看到:

  Parameters: {"uuid"=>"828b9a2ffc"}

如何在路线文件中实现?

由于

3 个答案:

答案 0 :(得分:1)

也许我错过了一些显而易见的东西,但使用如下路线有什么问题:

match '/threads/:uuid' => 'threads#show', :via => :get

routes.rb

答案 1 :(得分:1)

最简单的方法可能是:

match 'threads/:uuid' => 'threads#show', :as => :thread

这会使网址的最后一部分显示为params[:uuid]。如果您已经

resources :threads
然后将

定义为将其放在路径文件中,并覆盖已定义的threads#show路径。

答案 2 :(得分:0)

在routes.rb中你需要这样的东西:

get 'threads/:uuid', :action => "show", :as => "by_uuid"

这将创建一个thread_by_uuid_path(thread_object)辅助方法,但如果您还有:

resources :threads

...仍然会有使用show的标准:id路线,并且会与您在上面定义的新路线发生冲突。您可以手动定义每个路由并删除resources :threads行,但我倾向于单独保留路由并更改控制器方法,如下所示:

def show
  @thread = Thread.find_by_uuid(params[:id]) || Thread.find(params[:id])
  ...
end

...这样即使您希望传递UUID,仍然可以使用ID。