停止发布到外部服务查找用户ID

时间:2012-10-24 10:10:27

标签: ruby-on-rails ruby ruby-on-rails-3

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

我们在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?

1 个答案:

答案 0 :(得分:1)

你可能有类似before_filtercancan的内容,它从params获取id并尝试加载相应的对象。这是控制器中的常见做法。

关键是params包含合并:

因此GET /users/1GET /users?id=1具有相同的效果。

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