【问题标题】:Multiple, custom URLs for Rails 3 resources without ID没有 ID 的 Rails 3 资源的多个自定义 URL
【发布时间】:2011-08-04 00:20:55
【问题描述】:

在我的应用中,我想通过多个 URL 访问各种资源。例如,可以通过以下方式访问发票:

/invoices/:id

由发票开具人,也可通过:

/pay/:payment_key

由付款人。

后一个 URL 不需要身份验证(因此是加密的 payment_key)。

问题是如何获取自定义 URL 的自动 URL 帮助方法。通常您可以使用to_param 来自定义资源 URL(如 here 所述),但在这种情况下这还不够,因为我仍想保留默认资源 URL。

如果我通过声明命名路由来创建辅助方法:

/pay/:payment_key, :as => :invoice_payment

然后我希望invoice_payment_url(invoice) 包含invoice.payment_key,但它没有。 Rails 使用发票 ID 代替(类似于 here 报告的行为)

这个好像坏了。

所以我一直在为这个资源手动定义 url 助手。

def invoice_payment_path (invoice)
  url_for :controller => "invoices",
  :only_path => true,
  :action => "pay",
  :payment_key => invoice.payment_key
end

def invoice_payment_url (invoice)
  url_for :controller => "invoices",
  :only_path => false,
  :action => "pay",
  :payment_key => invoice.payment_key
end

想知道是否有 DRYer 方法可以做到这一点?

【问题讨论】:

    标签: ruby-on-rails-3 routing


    【解决方案1】:

    RESTful 是关于资源的。那么您确定系统中的“付款”和“发票”资源相同吗?对我来说,这更像是系统设计问题而不是路由问题。

    另一个想法是使用嵌套资源。您可以查看“/payments/:id/invoices”或“/invoices/:id/payments”,对我来说都有意义。

    【讨论】:

    • 我同意,但 id OP 仍然想遵循这条路线 invoice_payment_path(:payment_key => invoice.payment_key) 会起作用。
    • @gzbigegg 谢谢。同意它们是不同的资源,但这不是问题。我仍然想从发票创建付款,并且需要 url 帮助程序根据发票模型给我一个 URL。问题是使用什么键来识别资源。出于安全原因,我需要两个。
    • @Rubish 好的,但这会将创建正确 URL 的责任转移给调用者。我觉得这很恶心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多