我有一个Rails(4.2.6)应用程序,其中包含companies (id, serial...), user (id, serial, company_id...)
这样的表,其中serial是随机生成的5-20个字符长的字符串,每个表都是唯一的。我想要实现的是拥有/companies/:serial
和/users/:serial
...
我已阅读documentation,可以在routes.rb
中执行以下操作:
resources :companies, param: :serial
resources :users, param: :serial
现在,这不是太干......有没有办法在全球范围内做到这一点?我知道我可以将它放在一行(resources :companies, :users, param: :serial
)中,但我还有其他表,在其他名称空间中,我也想要应用规则。
我想到的另一件事是将串行作为主键,但我更喜欢自动递增整数,并且不希望我的数据库丢失像user.company_serial
这样的列,其长度值为10-20个字符...
我试图围绕我的资源制作一个param: :serial
范围:
scope param: :serial do
resources :companies
...
end
与path_names
一样(在文档中阅读here)但没有达到预期的效果,而是出于某种原因添加了params[:param]
符号值:serial
我真的不明白。
我也知道方法to_param
的存在,但如果我理解得很好,我应该在模型中使用它,所以我必须编写相同的代码,就像我拥有的模型一样多。
答案 0 :(得分:1)
执行此操作的方法是在URL中提交serial,就像使用id参数params[:id]
一样,并在控制器中使用它。
Company.find_by_serial(params[:id)
您无需更改路线,只需更改控制器操作。这也可以干涸。
您可以通过显式传递serial或添加to_param方法来完成此操作。如果你将to_param
添加到模型中,它将始终在它生成路径的每个地方使用它,它将使用id并为你节省一些工作。如果有一个地方你宁愿使用id(我喜欢在某些控制器中使用它,比如管理员控制器),那么你必须明确地传递它或解决它。