在 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 中自动使用模型属性生成路由的主要内容,如果未能解决你的问题,请参考以下文章
Rails 路由助手(即 mymodel_path(model))可以在模型中使用吗?
指定HTML标签属性 |Specifying HTML Attributes| 在视图中生成输出URL |高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼