2016-10-22 1 views
0

J'écris une simple API Rails qui se connecte à une ancienne base de données SQL Server. Je suis en train de tester mes actions REST pour mon contrôleur de contacts. Lors de l'utilisation de FactoryGirl pour créer des objets de test, j'ai rencontré le message d'erreur mentionné dans le titre. Mes actions index et show fonctionnent bien, mais l'action create lance cette erreur. Les parties pertinentes de mon contacts_controller ressemblent à ceci:Méthode non définie 'permit' pour "89718": Chaîne

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 

Et voici le code de test pertinent:

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 

Le modèle:

class Contact < ActiveRecord::Base 
    belongs_to :user 

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

Le sérialiseur (en utilisant la gemme active_model_serializer) :

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

choses que j'ai essayé comprennent:

  • Modification du 'belongs_to' à 'has_one' dans le sérialiseur (pas de changement)
  • Retrait de la 'zip_code_5' du Permite ... exigent la ligne (étrangement, Je suis toujours le message d'erreur sur cette propriété, peut-être à cause de la sérialiseur?)
  • Retrait de la sérialiseur (aucun changement)

Toute pensée? Je suis heureux de fournir toute information plus nécessaire.

EDIT

La valeur de @Contact quand il est passé à l'action create:

#<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> 

La valeur de params [: contact] lors de l'exécution:

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

J'ai aussi mes paramètres d'habillage sont définis sur: format json, si c'est pertinent.

+0

pour une raison quelconque votre 'params [: contact]' dans le contrôleur est une chaîne. Pouvez-vous vérifier la valeur de '@ contact' que vous passez en post? Peut-être aussi vérifier la valeur de 'params [: contact]' à l'exécution et montrer ce que c'est? –

Répondre

1

J'ai utilisé la console pour recréer ce que mon test faisait. J'ai découvert que Contact était passé comme une chaîne, au lieu d'un hachage. Après un peu de googling, j'ai passé l'objet @contact comme @ contact.attributes, qui passe un hachage de l'objet. Cela a résolu le problème du «permis», merci de me pointer dans la bonne direction.