我有一个没有ID列的Rails模型Object
。它使用来自其他两个模型的主键元组作为其主键dependency_id
和user_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
部分。如果可能的话,我仍然希望能够使用路径助手。
答案 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。