2016-10-22 38 views
0

我正在編寫一個簡單的連接到傳統SQL Server數據庫的Rails API。我正在測試我的聯繫人控制器的REST操作。當使用FactoryGirl創建測試對象時,我遇到了標題中提到的錯誤消息。我的索引和顯示操作正常,但創建操作拋出此錯誤。我contacts_controller的相關部分是這樣的:「89718」的未定義方法「許可」:字符串

def create 
    contact = Contact.new(contact_params) 
    if contact.save 
     render json: contact, status: 201, location: [:api, contact] 
    else 
     render json: { errors: contact.errors }, status: 422 
    end 
end 
... 
private 
    def contact_params 
     params.require(:contact).permit(:name, :address_1, :city, :zip_code_5, :country) 
    end 

這裏是相關的測試代碼:

describe "POST #create" do 
    context "when is successfully created" do 
     before(:each) do 
      @user = FactoryGirl.create :user 
      @contact = FactoryGirl.create :contact 
      post :create, { contact: @contact } 
     end 

     it "renders the json representation for the contact record just created" do 
      contact_response = json_response 
      expect(contact_response[:name]).to eq @contact_attributes[:name] 
     end 

     it { should respond_with 201 } 
    end 
end 

型號:

class Contact < ActiveRecord::Base 
    belongs_to :user 

    validates :name, :address_1, :city, :zip_code_5, :country, :createddate, presence: true 
end 

串行器(使用active_model_serializer寶石) :

class ContactSerializer < ActiveModel::Serializer 
    belongs_to :user 
    attributes :id, :name, :address_1, :city, :zip_code_5, :country 
end 

事情我已經嘗試過包括:

  • 更改「belongs_to的」到「HAS_ONE」在串行器(沒有變化)
  • 刪除從permite的「zip_code_5」 ......需要對線路(奇怪的是,我仍然有這個屬性的錯誤消息,也許是因爲串行?)
  • 卸下串行器(沒有變化)

有什麼想法嗎?我很樂意提供更多必要的信息。

編輯

當它傳遞到創建行動的@contact的價值:

#<Contact id: 89815, user_id: "d67b0d57-8f7f-4854-95b5-f07105741fa8", title: nil, firstname: nil, lastname: nil, name: "Alene Stark", company: nil, address_1: "72885 Bauch Island", address_2: nil, address_3: nil, city: "Joestad", state: nil, zip_code_5: "98117", zip_code_4: nil, country: "MF", status_id: 1, createddate: "2015-10-23 07:00:00", lastmodifieddate: "2012-11-29 08:00:00", errorreasonid: nil, computergenerated: true, sandbox: true, emailsubject: nil, jobtitle: nil, mergevar1: nil, mergevar2: nil, mergevar3: nil, mergevar4: nil, mergevar5: nil, mergevar6: nil, mergevar7: nil, mergevar8: nil, mergevar9: nil, mergevar10: nil, clientid: 1, isshared: true> 

則params的值:聯繫人]在運行時:

{"city"=>"Seattle", "state"=>"WA", "zip_code_5"=>"98117", "country"=>"US"} 

我也有我的包裝參數設置爲:json格式,如果這是相關的。

+0

由於某種原因,控制器中的'params [:contact]'是一個字符串。你可以檢查你傳遞給你的@ @ contact的值嗎?也可以在運行時檢查'params [:contact]'的值,並顯示它是什麼? –

回答

1

我用控制檯重新創建了我的測試。我發現Contact是作爲字符串傳遞的,而不是散列。在Google上搜索一下之後,我將@contact對象作爲@ contact.attributes傳遞給它,它傳遞對象的散列。這解決了'許可'問題,謝謝指引我朝着正確的方向。

相關問題