2013-05-21 62 views
1

我的客戶端應用程序將JSON編碼的POST發送到rails服務器,但服務器顯示406錯誤並且不響應json。已完成406在773ms內不可接受

UsersController創建

# POST /users 
# POST /users.json 
def create 
    @user = User.new(params[:user]) 

    respond_to do |format| 
    if @user.save 
     format.html { redirect_to @user, notice: 'User was successfully created.' } 
     format.json { render json: @user, status: :created, location: @user } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

Rails的控制檯:

Started POST "/users.json" for 127.0.0.1 at 2013-05-21 16:38:47 +0100 
Processing by Devise::RegistrationsController#create as JSON 
    Parameters: {"user"=>{"name"=>"", "available"=>"true", "email"=>"", "sex"=>"male", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}} 
WARNING: Can't verify CSRF token authenticity 
    (0.2ms) begin transaction 
    User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = '' LIMIT 1 
    (0.2ms) rollback transaction 
Completed 406 Not Acceptable in 773ms (ActiveRecord: 6.1ms) 

誰能幫助我?

+0

我建議的一件事是關閉CSRF令牌的真實性。爲此,請轉至呈現json的控制器並添加'skip_before_filter:verify_authenticity_token'。像調整其他過濾器一樣調整。這當然假設你無法在將JSON發送到Rails的應用程序中生成CSRF令牌。 – jason328

+1

關閉[跨網站請求僞造保護](https://en.wikipedia.org/wiki/Cross-site_request_forgery)對我來說聽起來不是一個好主意。 –

回答

0

您需要在控制器的頂部添加respond_to :json, only: [:create]。您可能需要爲採取HTML的操作添加respond_to :html

2

一會兒之後會試着回答這個問題,以防有人看到它。

respond_to do |format| 
    format.json { render json: @user, status: :created, location: @user } 
end 

即使顯式調用時:我過,即使我只有JSON作爲(在你的例子是這樣)我控制器底部的格式選項,在遇到這個問題, $.getJSON我的請求,它與JSON數據類型調用它。

我發現的訣竅是用我的頁面名稱上的.json調用它。

$.getJSON('controllername-your-calling.json?', function(json){ 
     //do your stuff... 
}); 

也許它可以幫助別人。