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.
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? –