REST路由和覆盖:带有to_param的id

时间:2012-02-20 21:14:59

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

我的控制器正在使用默认的RESTful路由来创建,添加,编辑等

我想将默认:id更改为使用:guuid。所以我做的是:

# routes.rb
resources :posts

# Post Model
class Post < ActiveRecord::Base
    def to_param  # overridden
        guuid
    end
end

这可行,但我修改过的REST控制器代码有类似的东西

def show
  @post = Post.find_by_guuid(params[:id])
  @title = "Review"
  respond_to do |format|
    format.html # show.html.erb
  end
end

当我看到这段代码时..

Post.find_by_guuid(params[:id])

这似乎不对,但它确实有效。 我不明白为什么我不能这样写出来:

Post.find_by_guuid(params[:guuid])

为什么我不使用时仍需要传递params[:id]? 寻找关于我的方法是否正确或需要考虑的其他事项的反馈 尽管它有效,但并不总是意味着它是正确的。

1 个答案:

答案 0 :(得分:2)

在控制台中键入rake routes,然后检查路由的输出。你会在其中一些片段中看到片段':id',这就是params[:id]来自的地方。这是一个rails约定:当您在路由中使用resources时,该参数名为id。我不知道你是否可以改变它(同时保留resources;否则你可以选择匹配的规则),但你不应该这样做:即使看起来不是很逻辑,它实际上也有意义,一旦了解rails路由的工作原理。