2015-04-23 69 views
2

因此,我在爲移動客戶端創建的RESTful API實現端點時觀察到一些奇怪的行爲。我正在使用PUT方法更新User模型上的屬性。我將用戶的ID作爲URL參數發送,並在JSON對象內部更新值。一切似乎工作得很好,但當我通過rails日誌檢查參數時,我發現了一些奇怪的東西。出於某種原因,有一個額外的參數被髮送到後端,我似乎無法解釋。下面是當我把這個端點從移動客戶端,我看到日誌:Ruby on Rails - PUT方法創建額外參數條目

Parameters: {"enable_security"=>true, "id"=>"7d7fec98-afba-4ca9-a102-d5d71e13f6ce", "user"=>{}} 

從以上的額外"user"=>{}可以看到被追加到參數項的列表。當我打印params對象時,我也看到了這一點。我似乎無法解釋這是從哪裏來的。我還檢查了移動客戶端,以確保安全,並且在代碼中我沒有發送帶有密鑰user的參數的地方。這令我非常困惑,並讓我覺得我錯過了一件相當簡單的事情。爲什麼有user密鑰被髮送到後端RESTful API的空對象?

更新,以提供更多的信息

這裏是被調用的代碼,當用戶點擊該更新用戶User模型端點:

#PUT /:id/user/update_security_settings 
    def update_security_settings 
    @user = User.find_by_id(params[:id]) 
    @user.advanced_security_enabled = params[:enable_security] 

    respond_to do |format| 
     if @user.save 
     response = {:status => "200", :message => "User's security settings updated."} 
     format.json { render json: response, status: :ok } 
     else 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

更新響應用戶的評論

以下是與user_controller相關的路線,視圖控制器定義所有端點都涉及創建和更新User模型。

post '/user/upload_profile', to: 'user#upload_profile' 
get '/:id/user', to: 'user#find_user' 
put '/:id/user/update_security_settings', to: 'user#update_security_settings' 
resources :user, :defaults => { :format => 'json' } 
+1

您可以發佈您提交的表單嗎?如果我沒有弄錯,我可以在那裏存在User.new。 – coderhs

+0

RESTFul api沒有任何形式。我可以發佈終端命中時調用的代碼嗎?這是你的意思嗎? @Coderhs – ScottOBot

回答

3

此評論是否真的能反映出您的實際路線?

#PUT /:id/user/update_security_settings

我希望它是/user/:id/update_security_settings代替。

你能告訴我們你的config/routes.rb - 我的猜測是你的路由以某種方式配置爲期望一個實際的嵌套用戶參數,你不會發送(當然),因此在日誌中顯示爲空。

更新: 您的一些路線是不尋常的。您實際上不需要find_user路由,因爲它應該在resources :user中作爲show動作(如果您在控制器中定義了show方法,這是檢索單個資源項的缺省方式;因此不需要find_user)

對於像update_security_settings動作的自定義路由,我建議堅持默認模式,如resource/:id/action並將其嵌套在默認的足跡路由中。將資源標識放在資源之前非常不尋常,令人困惑,並且實際上可能與您的問題有關(我不確定這一點)。嘗試清理您的routes.rb liek這樣的:

# notice that resources expects the plural form :users 
resources :users do 
    member do 
    patch :update_security_settings 
    post :upload_profile 
    # any other custom routes 
    end 
end 

這會導致類似GET /users(指數)的路線,GET /users/1(顯示)和PATCH /users/1/update_security_settings

更多關於路由的在這裏找到:Rails Guides | Routing From The Outside In

請檢查上面的變化刪除您空的用戶PARAM。

+0

嘿@thirdsun我發佈了與有問題的控制器相關的路由。我很抱歉,如果我的URL有點不合常規,我沒有使用Ruby on Rails進行任何正式培訓,也不瞭解許多常見的編碼約定和最佳實踐。 – ScottOBot

+0

@ScottOBot謝謝,我更新了我的答案。再次,我的猜測是,不尋常的路線設計(如:用戶之前的id)引入了意想不到的/奇怪的參數。 – thirdsun

0

檢查配置在

config/initializers/wrap_parameters.rb 

wrap_parameters format: []此列表中不應包含JSON然後將包裝參數的你的根控制器的所有JSON請求。請參閱api文檔