如何更改ActiveAdmin路由ID的约束?

我正在对使用ActiveAdmin的Rails站点进行更改,包括将URL中使用的标识符更改为有意义的字符串。

在ActiveAdmin之外,只需更改每个模型的to_param方法即可。 这也更改了为ActiveAdmin页面上的链接生成的URL,但要使ActiveAdmin模型响应新URL,还需要更改ActiveAdmin注册,如本答案中所述 。

此站点上的一个模型在一些有意义的标识符中使用点/句点。 (这不是我可以改变的。)Rails基于扩展的格式识别会导致这些记录出现问题。 在ActiveAdmin之外,可以通过更改路由上的id约束来解决这些问题,如本答案中所述 。 (在此基础上允许指定格式的扩展需要在控制器中进行一些额外的工作。)不幸的是,更改非ActiveAdmin路由的约束对任何ActiveAdmin路由都没有影响。 可以手动指定ActiveAdmin路由(而不是仅仅依赖于ActiveAdmin.routes(self) ),如本答案中所述 ,但我还没有找到一种方法,可以允许相同的约束更改,适用于非-ActiveAdmin路线。

如何更改ActiveAdmin路由中的ID约束以允许包含点?

以下是两次尝试使路由正确但无法允许点:

 get "/admin/motors/:id", id: /[^\/]+/, controller: "admin/motors", action: "show" 
 get "/admin/motors/:id", constraints: { :id => /[^\/]+/ }, controller: "admin/motors", action: "show" 

问题的尝试都是正确的,但是,它们必须出现在ActiveAdmin.routes(self)之前; 来自外部的Rails路由 :

Rails路由按照指定的顺序进行匹配,因此如果您有resources :photos get 'photos/poll'之上的get 'photos/poll'resources行的show action路线将在get行之前匹配。 要解决此问题,请将get行移到resources上方 ,以便首先匹配。