1

我不确定如何描述这个问题,所以会尽量清楚。

我们的 Rails 应用程序中有一个页面,我们的客户可以在其中更新他们的信用卡详细信息。表单发布到外部服务以验证详细信息。然后透明地重定向回我们。

最初,我将表单放在它自己的控制器中进行测试(完美运行),但我只是将它移到了我的 users_controller 中。

表单发布并重定向到执行一些检查的确认操作。当我从用户控制器中发布时,我收到一个错误:

 Couldn't find User with id=k2hx5p36w3g9rxsz

这实际上是交易的 id。不是用户。

网址如下所示:

 http://localhost:8080/settings/confirm?http_status=200&id=k2hx5p36w3g9rxsz&kind=update_payment_method&hash=9c85b12c1242cd58de27b2582c934e34a0e9455e6

在我的控制器中,我有这个:

def billing
  @user = current_user 
  @credit_card = current_user.default_credit_card  
  @tr_data = CreditCard::TransparentRedirect.update_credit_card_data(:redirect_url => confirm_credit_card_info_url, :payment_method_token => @credit_card.token)
  ...
end

def credit_card_confirm
  @user = current_user 
  @result = CreditCard::TransparentRedirect.confirm(request.query_string)

  if @result.success?
    redirect_to user_billing_path, :notice => "Credit card updated"
  else
    render :action => "billing"
  end
end

在我的路线中:

match '/settings/confirm' => 'users#credit_card_confirm', :as => :confirm_credit_card_info

我该怎么做才能避免将 ID 作为用户 ID?

4

1 回答 1

1

您可能有类似 a before_filteror的东西cancan,它从 params 获取 id 并尝试加载相应的对象。这是控制器中的常见做法。

关键是params包含以下合并:

所以GET /users/1GET /users?id=1有同样的效果。

解决方案是了解 id 用于加载用户的特定代码片段。如果它是您的代码(或以其他方式可跳过),则跳过过滤器或任何适合该credit_card_confirm操作的内容,如果它不是您的代码,则必须使用单独的控制器。

于 2012-10-24T11:02:31.140 回答