没有ID的Rails 3资源的多个自定义URL

时间:2011-08-04 00:20:56

标签: ruby-on-rails-3 routing

在我的应用程序中,我有各种资源,我想通过多个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方法吗?

1 个答案:

答案 0 :(得分:1)

RESTful是关于资源的。那么你确定系统中的“付款”和“发票”资源是一样的吗?对我而言,它更像是系统设计问题,而不是路由问题。

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