Rails - 覆盖名称路由参数 - GLOBALLY

时间:2016-10-27 18:20:27

标签: ruby-on-rails ruby-on-rails-4 routes

我有一个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的存在,但如果我理解得很好,我应该在模型中使用它,所以我必须编写相同的代码,就像我拥有的​​模型一样多。

1 个答案:

答案 0 :(得分:1)

执行此操作的方法是在URL中提交serial,就像使用id参数params[:id]一样,并在控制器中使用它。

Company.find_by_serial(params[:id)

您无需更改路线,只需更改控制器操作。这也可以干涸。

您可以通过显式传递serial或添加to_param方法来完成此操作。如果你将to_param添加到模型中,它将始终在它生成路径的每个地方使用它,它将使用id并为你节省一些工作。如果有一个地方你宁愿使用id(我喜欢在某些控制器中使用它,比如管理员控制器),那么你必须明确地传递它或解决它。