【问题标题】:How to pass variable from instance method into controller?如何将变量从实例方法传递到控制器?
【发布时间】:2012-07-19 00:16:51
【问题描述】:

我需要为每个用户(管理部分)调用方法,其中包含电子邮件参数。这是在 PayPal 中付款的功能,但在某些情况下我不能使用重定向。

我认为payments.erb的代码:

 % @users.each do |user| %>
<li>
  <%= user.email %>
  <%= link_to "Pay", user.pay(user.email) %>
</li>

支付方式代码

def pay email
//making post request to PayPal
//res = clnt.post(uri, data, header)
//if res.status ==200
//redirect_to PayPal
//else redirect_to :back
end

如何传递参数或如何重新组织这一切? 我需要在页面控制器中创建一个操作,还是可以使用一些 after_call_pay 功能?

【问题讨论】:

    标签: ruby-on-rails actionview actioncontroller


    【解决方案1】:

    响应实例方法不是控制器的工作。响应请求是控制器的工作。

    因此,您希望能够链接到响应 mydomain.com/users/1/pay 或类似内容的操作。

    在路线中

    resources :users do
      member do
        post 'pay'
      end
    end
    

    然后在你的控制器中

    def pay
      @user = User.find(params[:id])
      #route user to paypal or somewhere else based on some condition
    end
    

    最后在视图中

    <%= link_to "Pay", pay_user_path(user) %>
    

    【讨论】:

    • DVG,不是用户应该调用这个函数,而是管理员,这将支付给用户..我不能使用 params[:id]。那你有什么建议呢?
    • 我相信你会想把它放在用户控制器上,因为那是你正在对其进行操作的资源,尽管管理员正在启动它,并且大概你会有某种身份验证/授权围绕此操作,以防止非管理员启动它。
    【解决方案2】:

    我认为您应该以表单而不是链接来处理此问题。

    如果支付是一种与用户对象相关联的方法,那么您可能需要执行以下操作:

    查看 -

    <%= form_for @user, :url => { :action => "make_payment" } do |f| %>
        #any form fields associated with making the payment (ie credit card number)
        <%= f.submit %>
    <% end %>
    

    这会将表单路由到 Users_controller 和名为“make_payment”的操作。确保在 config/routes 文件中提供此操作的路由,因为如果您使用标准资源路由,则无法访问。

    控制器 -

    def make_payment
       @user = User.find(params[:id])
       user.submit_payment(params[:credit_card_num])
       redirect_to @user
    end
    

    这应该可以完成您想要做的事情。在此处查看有关 rails form helpers http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for

    的更多说明

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-10
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      相关资源
      最近更新 更多