2016-06-12 40 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请求实现相同的功能。

相关问题