2016-01-12 2 views
0

Я массив под названием actors, который содержит объекты, каждый объект имеет данные о актере, таких как его имя и т.д.ArgumentError (неверное число аргументов при создании нескольких записей

Я пытаюсь сохранить данные в моем SQLite БД с помощью Rails, но я бег в некоторых проблемы.

Я пытался несколько создавать функции в моем контроллере актера,

def create 
    actors = Actor.create(params[:actors]) 
    redirect_to :root 
end 

Это создает новую запись, хотя содержание пусто,

{"id":8,"name":null,"character":null,"movie_id":null} 

Я подумал, что мне нужно добавить параметры в функции создания, как это так,

def create 
    actors = Actor.create(params[:actors], movie_id: params[:movie_id], name: params[:name], character: params[:character]) 
    redirect_to :root 
end 

Но это возвращает ошибку,

ArgumentError (неверное число аргументов (2 для 0..1))

* обновление *

Это рельсы журнал из запроса пост,

Started POST "/actors.json" for 127.0.0.1 at 2016-01-12 17:08:05 +0100 
Processing by ActorsController#create as JSON 
    Parameters: {"_json"=>[{"name"=>"Michael B. Jordan", "character"=>"Adonis Creed", "movie_id"=>312221}, {"name"=>"Sylvester Stallone", "character"=>"Rocky Balboa", "movie_id"=>312221}, {"name"=>"Graham McTavish", "character"=>"Tommy Holiday", "movie_id"=>312221}, {"name"=>"Tessa Thompson", "character"=>"Bianca", "movie_id"=>312221}, {"name"=>"Phylicia Rashād", "character"=>"Mary Anne Creed", "movie_id"=>312221}, {"name"=>"Hans Marrero", "character"=>"Flores", "movie_id"=>312221}, {"name"=>"Will Blagrove", "character"=>"James", "movie_id"=>312221}, {"name"=>"Tony Bellew", "character"=>"'Pretty' Ricky Conlan", "movie_id"=>312221}, {"name"=>"Ritchie Coster", "character"=>"Pete Sporino", "movie_id"=>312221}, {"name"=>"Jacob 'Stitch' Duran", "character"=>"Stitch", "movie_id"=>312221}, {"name"=>"Malik Bazille", "character"=>"Amir", "movie_id"=>312221}, {"name"=>"Wood Harris", "character"=>"Tony 'Little Duke' Burton", "movie_id"=>312221}, {"name"=>"Gabe Rosado", "character"=>"Leo 'The Lion' Sporino", "movie_id"=>312221}], "actor"=>{}} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]] 
Completed 500 Internal Server Error in 6ms (ActiveRecord: 0.2ms) 
+0

По существу, вы не можете делать то, что вы пытаетесь, рельсы не обеспечивают эту функциональность. Что находится в параметрах? Вы можете либо создавать записи, либо использовать 'accepts_nested_attributes'. –

+0

Я предлагаю вам взглянуть на http://apidock.com/rails/ActiveRecord/Persistence/ClassMethods/create вы можете показать нам параметры? – djothefou

+0

@ j-dexx как бы вы проходили через и создавали? – alucardu

ответ

3

Вам нужно перебирать каждый актер в Params [: актеры] хэша и присвоить значения каждого парам в том, что в вашей Actor модели.

def create 
    actors = params[:actors].each do |key, value| 
     Actor.create({ 
     movie_id: value[:movie_id], 
     name: value[:name], 
     character: value[:character] 
     }) 
    end 
    redirect_to :root 
end 

Отказ от ответственности: Я сомневаюсь, что этот код 100% правильно, я не уверен, что если бы я сделал синтаксис правильно для получения значений из Params (это помогло бы увидеть, что PARAMS есть), но это должен поставить вас в правильном направлении. Также попробуйте посмотреть на эти посты:

Accessing array of parameters inside the params[] value

Build array of objects from params hash after Transaction block fails, Rails

EDIT: Попробуйте это ...

def create 
    actors = params[:json].each do |actor| 
     Actor.create({ 
     movie_id: actor["movie_id"], 
     name: actor["name"], 
     character: actor["character"] 
     }) 
    end 
    redirect_to :root 
end 
+0

Благодарим вас за предложение, я пробовал код, но он возвращает 'NoMethodError (неопределенный метод' each 'для nil: NilClass): 'Так что, похоже, что что-то не так с' params [: actors] 'right? Я добавил вывод журнала консоли rails из почтового запроса, возможно, вы можете увидеть, что там не так. – alucardu

+0

Правильно, NilClass означает, что 'params [: players]' не существует. Теперь, когда вы вставили свои параметры, вы можете понять, почему, правильно? Похоже, вы должны заменить эту часть кода на 'params [: _ json]' – Haymaker87

+0

. Спасибо Haymaker, я в основном сторонний разработчик, который пытается изучить некоторые исходные вещи. Отладка рельсов для меня очень тяжелая, я пока не вижу логики. Я изменил его на 'params [: _ json]'. Теперь журнал возвращает 'NoMethodError (неопределенный метод' [] 'для nil: NilClass): 'так выглядит, как рельсы видят массив как пустой? – alucardu

1

Вам необходимо пройти в хэш методу create.

Выполните следующие действия:

  • итерацию по каждому объекту в params[:actors]

    params[:actors].each do |actor| 
    
  • Создайте следующий хэш со значениями name, character и movie_id путем извлечения его из объекта.

    hsh = { 
        :name => actor.name, #Assuming your actor object has this property 
        :character => actor.character, #Similarly actor.character 
        :movie_id => actor.movie_id  #actor.movie_id 
    } 
    
  • Теперь вы можете передать это ваш create как:

    Actor.create(hsh) 
    

EDIT:
После просмотра журнал ошибок, кажется, что вам нужно перебирать params[:_json] массив.

Таким образом, вы можете просто сделать это:

params[:_json].each do |actor| 
    Actor.create(actor) 
end 

Это должно работать, так как каждый документ в формате JSON params[:_json] актер хэш.

+0

Не могли бы вы показать, как перебирать массив актеров? – alucardu

+0

@alucardu проверить отредактированный ответ – Atri

+0

Это похоже почти на работу. Но он возвращает 'NoMethodError (неопределенное имя метода для # ):' поэтому он выглядит так, что у рельсов возникают проблемы с поиском правильных значений для вставки. – alucardu

Смежные вопросы