1

この問題を説明する方法がよくわからないので、明確にしようとします。

Rails アプリケーションには、顧客がクレジット カードの詳細を更新できるページがあります。詳細を確認するために、フォームが外部サービスに投稿されます。その後、透過的にリダイレクトされます。

最初は、テスト用に独自のコントローラーにフォームを持っていましたが (完全に機能しています)、users_controller 内に移動しました。

フォームが投稿され、いくつかのチェックを行う確認アクションにリダイレクトされます。ユーザーコントローラー内から投稿すると、エラーが発生します。

 Couldn't find User with id=k2hx5p36w3g9rxsz

実際には、これはトランザクションの ID です。ユーザーではありません。

URL は次のようになります。

 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

おそらく、params から ID を取得し、対応するオブジェクトをロードしようとするbefore_filterorのようなものがあります。cancanこれは、コントローラーの一般的な方法です。

ポイントはparams、次のマージが含まれていることです。

  • ルーターから設定された名前付きパラメーター ( /users/:id)
  • http://apidock.com/rails/Rack/Utils/parse_nested_queryによって変換されたクエリ文字列
  • 上記のように存在する場合、または必要に応じて JSON/XML から変換された本文。

したがってGET /users/1GET /users?id=1同じ効果があります。

解決策は、ユーザーをロードするために id が使用されているコードの特定の部分を理解することです。credit_card_confirmそれがあなたのコード (またはスキップ可能なもの) である場合は、フィルターまたはアクションに適したものをスキップします。それがあなたのコードでない場合は、別のコントローラーを使用する必要があります。

于 2012-10-24T11:02:31.140 に答える