2016-06-12 31 views
0

我在視圖此鏈接:爲什麼link_to在訪問視圖時在裏面運行一個方法?

<%= link_to "Pay in PayPal", @order.paypal_url(edit_order_url, payment_notification_url), class: "btn btn-success" %> 

這在模型

class Order < ActiveRecord::Base 
def paypal_url(return_url, notify_url) 
    # ... Do stuff 
    self.update_attribute(:payment_in_process, true) 
    # Do more stuff...  
    end 



當我參觀視圖,模型得到其屬性已更新。我不想要這個。如果鏈接被點擊,我只想更新屬性。

知道如何做到這一點?

回答

1

讓我首先簡要概述link_to方法。根據api,此方法創建使用由該組options創建一個URL給定name的鏈接標籤:

link_to(name = nil, options = nil, html_options = nil, &block) 

在您的特定情況下,name是「貝寶支付」,這是一個普通字符串。第二個參數,URL,是更復雜一點,因爲你沒有通過任何形式在網站上的內容絕對或相對路徑,但調用該方法的對象上,而不是:

@order.paypal_url(edit_order_url, payment_notification_url) 

什麼在這裏發生是立即調用該特定方法paypal_url,並且link_to希望此方法返回正確URL。從文檔的熟悉的例子,例如:

link_to "Profile", profile_path(@profile) 
# => <a href="/profiles/1">Profile</a> 

這裏profile_path同樣的情況,是接受一個參數來獲得一種方法以其獨特的id,因此能夠產生正確的路徑。相同的規則適用於此處:只要用戶通過鏈接請求頁面,就會調用此方法。

因此,第一件要做的事就是刪除與點擊後處理方法相關的所有內容。

但是,您希望在單擊鏈接後使這些內容發揮作用。實際上,用戶是否點擊鏈接(或不是)是在控制器層進行的。簡單地說,如果控制器操作被調用,那麼你知道用戶點擊了一個鏈接。

所以第二步是對你的內部控制器動作做出某種請求並把相關的邏輯放在那裏。如果paypal_url將用戶引導至內部網站頁面,則可能已經執行了該操作。另一方面,您的paypal_url可能會導致外部頁面,如實際的PayPal處理......在這種情況下,您可以通過重定向或ajax請求實現相同的功能。

相關問題