2016-11-13 55 views
0

我有一個Rails 5 API,它應該能夠從HTTP POST請求中發送的JSON中創建Visit對象並將其存儲在數據庫中。 訪問模型與VisitComplement模型具有關聯(has_one)。 我使用cURL發送的發佈請求也包含此關聯的字段。Rails API沒有正確接收cURL POST嵌套的json

問題是VisitComplement數據沒有存儲在數據庫中,只有訪問數據被存儲。

訪問模式:

class Visit < ApplicationRecord 
    has_one :visit_complement 
    has_one :physical_exam 

    accepts_nested_attributes_for :visit_complement 

end 

VisitsController:

class VisitsController < ApplicationController 

    def create 
    @visit = Visit.new(visit_params) 

    if @visit.save 
     render json: @visit, status: :created, location: @visit 
    else 
     render json: @visit.errors, status: :unprocessable_entity 
    end 
    end 

    private 
    def visit_params 
     params.require(:visit).permit(:fumo, :alcool, visit_complement_attributes: [:sintomas]) 
    end 
end 

捲曲POST請求:

curl -H "Accept: application/json" -H "Content-type: application/json" -d '{"fumo": "10", "visit_complement_attributes": {"sintomas": "febre"}}' http://localhost:3000/api/v1/visits 

當我運行上面的命令,我從服務器獲取以下的輸出:

<!-- language: lang-none --> 
Started POST "/api/v1/visits" for ::1 at 2016-11-13 16:14:56 -0200 
Processing by VisitsController#create as JSON 
    Parameters: {"fumo"=>"10", "visit_complement_attributes"=>{"sintomas"=>"febre"}, "visit"=>{"fumo"=>"10"}} 
Can't verify CSRF token authenticity. 
    (0.2ms) begin transaction 
    SQL (0.5ms) INSERT INTO "visits" ("fumo", "created_at", "updated_at") VALUES (?, ?, ?) [["fumo", 10], ["created_at", 2016-11-13 18:14:56 UTC], ["updated_at", 2016-11-13 18:14:56 UTC]] 
    (1.0ms) commit transaction 
Completed 201 Created in 33ms (Views: 3.0ms | ActiveRecord: 2.4ms) 

aditional的信息

  1. 雖然這是一個軌道的API,我沒有與--api創建選項。
  2. 我正在使用rack-cors gem來繞過CSRF身份驗證問題
  3. 我沒有VisitComplement模型的控制器。
+0

'無法驗證CSRF令牌authenticity.'這將是你的問題。你不能讓它正確設置。請仔細檢查一下。 – baron816

+0

不是這樣。這是我用機架寶石繞過的安全問題。 但是可以肯定的是,我使用--api選項創建了一個新應用程序(在這個應用程序中我沒有這個安全問題),但我仍然有同樣的問題。看來rails參數包裝機制會將「fumo」=>「10」,「visit_complement_attributes」=> {「sintomas」=>「febre」}轉換爲「visit」=> {「fumo」=>「10 「},沒有看到關聯數據。 –

回答

0

找到了答案。問題是,我VisitComplement類是這樣的:

class VisitComplement < ApplicationRecord 
    belongs_to :visit 
end 

這belongs_to的協會預計,父親 之前創建的孩子一樣在這裏Rails nested form error, child must exist

說,爲了解決這個問題,無論是取消關聯或添加存在要求:錯誤。

也不得不改變visit_params方法:

def visit_params 
    params.permit(:id, :fumo, :visit_complement_attributes => [:id, :visit_id, :sintomas]) 
end 
0

更新您的訪問模式,如下所示。

class Visit < ApplicationRecord 
    has_one :visit_complement 
    has_one :physical_exam 

    accepts_nested_attributes_for :visit_complement 

    attr_accesible :visit_complement_attributes 

end 

我希望這對你有效。

+0

它不起作用。我得到以下內容: NoMethodError(未定義的方法'attr_accesible'爲#你的意思是?attr_accessor): 從我所搜索的內容來看,這是一箇舊方法,它在rails 4中被棄用,並在rails 5中被淘汰。我嘗試了attr_accessor方法,但沒有運氣。 –