在Rails应用程序中混淆ID

我试图模糊离开服务器的所有ID,即ID出现在URL和HTML输出中。

我写了一个简单的Base62 lib,它有方法编码和解码。 定义或更好地覆盖ActiveRecord的id方法以返回id的编码版本,并调整控制器以使用解码的params[:id]加载资源,从而得到所需的结果。 现在,id在URL中编码为base62,响应显示正确的资源。

现在我开始注意到通过has_many关系定义的子资源没有加载。 例如,我有一个名为User的记录has_many Post s。 现在User.find(1).posts为空,尽管有些post的user_id = 1 。 我的解释是,ActiveRecord必须将Postuser_idUser方法 id进行比较 – 我已经覆盖了 – 而不是与self[:id]进行比较。 所以基本上这使得我的方法毫无用处。

我想要的是在模型中定义obfuscates_id并且其余部分将被处理,即在适当的位置进行所有编码/解码并防止服务器返回id。

有没有可用的gem或有人有提示如何实现这一目标? 我敢打赌,我不是第一个尝试这个的人。

您所描述的内容听起来像是一个URL slug的专门应用程序。 看看acts_as_sluggable或friendly_id等插件。 另请参阅覆盖User模型上的to_param方法。

也许从这里开始: Rails的最佳永久化