Rails 5 создает несколько записей одной модели в одной форме, ошибка неизвестного атрибута - PullRequest
0 голосов
/ 12 октября 2018

Мне нужно создать форму, которая может обрабатывать создание нескольких записей одной модели, и передавать информацию способом, который проходит через Сильные Параметры Rails.В интерфейсе я динамически добавляю два новых текстовых поля для имени и породы щенка и хочу сохранить их все в форму.Но у меня возникают проблемы с передачей множества имен щенков и породы с помощью Strong Params;получение

неизвестного атрибута 'puppies' для Puppy

Я думаю, что это что-то очень простое, я пропускаю.Пожалуйста, помогите сгенерировать этих щенков!

new.html.erb

<%= form_tag puppies_path do %>
 <%= text_field_tag “puppies[puppies][]puppy[name]” %>
 <%= text_field_tag “puppies[puppies][]puppy[breed]” %>
 <%= submit_tag “Add Puppy” %>
<% end %>

, который генерирует эти параметры

"puppies"=>{"puppies"=>[{"puppy"=>{"name"=>"ribbon", "breed"=>"poodle"}}]}

и Сильные параметры в контроллере

class PuppiesController < ApplicationController
  def index
    @puppies = Puppy.all
  end

  def new
  end

  def create
    puppies_array = puppies_params[:puppies].each do |puppy|
                      puppy[:puppy]
                    end
    Puppy.create(puppies_array)
  end 

  def show
    @puppy = Puppy.find(params[:id])
  end  

  private
    def puppies_params
      params.require(:puppies).permit({ 
        puppies: [
          puppy: [
            :name, 
            :breed
          ] 
        ]
      })
    end  
end

Есть идеи, что мне не хватает?

Псевдокод того, через что я хочу пройти:

[(имя, порода), (имя, порода), (имя, порода)]

Как я могу написать это правильно?Я следую этому уроку https://medium.com/@dmccoy/how-to-build-html-inputs-to-submit-an-array-of-hashes-with-a-rails-form-tag-that-work-with-strong-f70a6c03d78e

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Чтобы получить массив атрибутов, который вы хотите, вы можете сделать это:

puppies_array = puppies_params[:puppies][:puppy].map{|puppy| puppy.values}

Это принимает хэш puppies в параметрах puppy и принимает массив хэшей в puppy изатем принимает только часть значения хэшей в этом массиве.

Вы получите свой результат псевдокода.

Для информации, обратите внимание, что puppy в блоке карты не имеет специальныхзначение ... это просто указывает на экземпляр массива.Вы могли бы так же легко сделать

puppies_array = puppies_params[:puppies][:puppy].map{|some_dog| some_dog.values}
0 голосов
/ 12 октября 2018

Вы не добавили оставшуюся часть кода вашего контроллера, но я предполагаю, что вы используете что-то вроде: Puppy.create(puppies_params)

Но так как вы вкладываете параметры в ваше представление, вам нужно будет использовать Puppy.create(puppies_params[:puppies]), чтобы убедиться, что вы можете передать правильный массив имен и перейти в действие create.

Редактировать Поскольку массив щенков содержит хеш с ключом щенка, нам потребуетсячтобы извлечь их, чтобы получить окончательный массив атрибутов puppy.

def create
  puppies_array = puppies_params[:puppies].collect do |puppy|
                    puppy[:puppy]
                  end
  Puppy.create(puppies_array)
end

В моем комментарии ниже есть сокращение для настройки массива puppies, вы можете использовать любую версию, которая выглядит более читабельной и понятной для вас

...