在 URL 中自动使用模型属性生成路由

Posted

技术标签:

【中文标题】在 URL 中自动使用模型属性生成路由【英文标题】:Automatically use model attributes in URL generating a route 【发布时间】:2021-10-04 07:30:38 【问题描述】:

你好 Rails Stack 社区!

我想为模型生成一个公共共享 URL,该 URL 应始终包含一些哈希以防止 URL 猜测。

这是我想出的:

# routes.rb
resources :reports do
  member do
    get '/public/:public_hash', to: 'reports#public', as: 'public'
  end
end

# In some view
public_report_path(@report, @report.public_hash) 
# /reports/1234/public/xxxx-xxxxx-xxxxx-xxxx

这工作好的,但我觉得应该有一个更优雅的方式来做到这一点从路线定义。我想做的是public_report_path(@report),它应该在生成URL时自动包含public_hash

以下内容:

# routes.rb
resources :reports do
  member do
    get :public, do |route_object|
      route_object.path.push(route_object.params.first.public_hash)
    end
  end
end

# In some view
public_report_path(@report) 
# /reports/1234/public/xxxx-xxxxx-xxxxx-xxxx

我看到了一些解决方案,其中url_for 的定义被覆盖了我宁愿不覆盖核心功能。然后我更喜欢给 url helper 提供 2 个参数。

【问题讨论】:

我认为路径助手是用来从中选择 id 的,除非你用#to_param 做某事。我不是 100% 的人 【参考方案1】:

为自己省去很多麻烦并在 Rails 迁移中使用 uuid?

https://guides.rubyonrails.org/v5.0/active_record_postgresql.html#uuid

您需要做的就是在迁移中运行它:

  create_table : reports, id: :uuid  do |t|
    t.timestamps
  end

然后将尊重标准的铁路路线、关系等。

【讨论】:

在某些情况下,虽然有单独的内部和外部标识符可能是有利的。 我喜欢你的想法。但在我的情况下,用户可以重新生成 UUID,以使任何以前共享的链接都无法访问。我查看了一个使用 param: :public_hash 的解决方案,但只有当 所有 资源通过该路径而不是一个成员时才有效。

以上是关于在 URL 中自动使用模型属性生成路由的主要内容,如果未能解决你的问题,请参考以下文章

django:路由,模板,模型系统

如何自动解析 Sails.js 路由上的模型属性?

Rails 路由助手(即 mymodel_path(model))可以在模型中使用吗?

指定HTML标签属性 |Specifying HTML Attributes| 在视图中生成输出URL |高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼

骨干路由器,视图和模型合作

Laravel反向路由的好处