带有备用主键的map.resources

时间:2010-06-29 17:27:12

标签: ruby-on-rails rails-routing

我有一个没有ID列的Rails模型Object。它使用来自其他两个模型的主键元组作为其主键dependency_iduser_id

我想做的是能够在routes.rb中执行类似的操作:

map.resources :object, :primary_key => [:dependency_id, :user_id]

它可以神奇地生成这样的网址:

/objects/:dependency_id/:user_id
/objects/:dependency_id/:user_id/1
/objects/:dependency_id/:user_id/1/edit

...除了我刚刚做到这一点,并且没有这样的语法。

有没有办法自定义map.resources,这样我就可以获得RESTful URL,而无需为所有内容制作自定义路由?或者我只是因为不遵守ID惯例而搞砸了?

:path_prefix选项看起来很有希望,但我仍然需要一种方法来删除URL的id部分。如果可能的话,我仍然希望能够使用路径助手。

1 个答案:

答案 0 :(得分:2)

您应该覆盖Object模型的方法to_param以反映您的主键。像这样:

def to_param
  [dependency_id, user_id].join('-')
end

然后,当您为这些对象(如object_path(some_object))设置网址时,它会自动转换为/objects/5-3之类的内容。然后在show action中你必须在dash上拆分params[:id]并通过dependency_id和user_id找到对象:

def show
  dep_id, u_id = params[:id].split('-').collect(&:to_i)
  object = Object.find_by_dependency_id_and_user_id(dep_id, u_id)
end

您还可以查看find_by_param gem for rails