我不确定如何描述这个问题,所以会尽量明确。
我们在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?
答案 0 :(得分:1)
你可能有类似before_filter
或cancan
的内容,它从params获取id并尝试加载相应的对象。这是控制器中的常见做法。
关键是params
包含合并:
/users/:id
)因此GET /users/1
和GET /users?id=1
具有相同的效果。
解决方案是了解用于加载用户的id的特定代码段。如果它是您的代码(或以其他方式可跳过),则跳过过滤器或适用于credit_card_confirm
操作的任何内容,如果它不是您的代码,则必须使用单独的控制器。