2011-08-04 29 views
0

在我的應用程序中,我有多種想要通過多個URL訪問的資源。例如,發票可以通過以下方式訪問:沒有ID的Rails 3資源的多個自定義URL

/invoices/:id 

通過發票的發行者,並且還通過:

/pay/:payment_key 

由付款人。

後一個URL不需要驗證(因此支付的密鑰已經分開)。

問題是如何獲取自定義URL的自動URL助手方法。通常情況下,您可以使用to_param來自定義資源URL(如here所述),但在這種情況下這還不夠,因爲我仍然想保留默認資源URL。

如果我創建的helper方法通過聲明名爲路線:

/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

RESTful是關於資源。那麼你確定你的系統中的「支付」和「發票」資源是否一樣?對我而言,它更像是一個系統設計問題,而不是路由問題。

另一個想法是使用嵌套資源。您可以查看「/ payments /:id/invoices」或「/ invoices /:id/payments」,兩者都對我有意義。

+0

我同意,但ID OP還是要遵循這條路線'invoice_payment_path(:payment_key => invoice.payment_key)'會的工作。 – rubish

+0

@gzbigegg謝謝。同意他們是不同的資源,但這不是問題。我仍然希望從發票中創建付款,並且需要url助手爲我提供基於發票模型的網址。問題是用什麼鍵來標識資源。出於安全原因,我需要兩個。 –

+0

@Rubish好吧,但這會將創建正確URL的責任轉移給調用者。這對我來說很難受。 –