2012-10-24 60 views
1

我不太確定如何描述這個問題,所以將嘗試清楚。停止發佈到外部服務尋找用戶ID

我們的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?

回答

1

您可能有類似於before_filtercancan的東西,它會從params中獲取id並嘗試加載相應的對象。這是控制器中的常見做法。

的一點是,params包含的合併:

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

解決方案是瞭解您的代碼中哪些特定的代碼用於加載用戶。如果它是您的代碼(或以其他方式可跳過),則跳過過濾器或適用於credit_card_confirm操作的任何適當代碼,如果它不是您的代碼,則必須使用單獨的控制器。

+0

就是這樣。使用load_and_authorize_resource和skip_authorize_resource停止驗證。乾杯。小號 – simonmorley