【问题标题】:Why is link_to running a method inside it when the view is visited?为什么在访问视图时 link_to 在其中运行一个方法?
【发布时间】:2016-10-12 18:56:08
【问题描述】:

我在视图中有这个链接:

  <%= 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



当我访问 视图 时,模型会更新其属性。我不想要这个。我只希望在单击链接时更新属性。

知道如何做到这一点吗?

【问题讨论】:

    标签: ruby-on-rails paypal model


    【解决方案1】:

    让我从link_to 方法的简要概述开始。根据api,此方法使用options 集合创建的URL 创建给定name 的链接标签:

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

    在您的特定情况下,name 是“Pay in PayPal”,这是一个纯字符串。第二个参数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_url 可能会导致外部页面,例如实际的贝宝处理...在这种情况下,您可以通过重定向或 ajax 请求实现相同的目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 2019-09-26
      • 2018-01-20
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      相关资源
      最近更新 更多