Rails — Сохранение вложенных массивов

Я смог создать вложенные массивы в своем представлении для публикации в моем действии «создать». Но я не уверен, как сохранить вложенный массив.

Вот базовое действие создания, в котором все отдельные параметры объединяются в массово назначаемые параметры:

def create
  @post = Post.new(params[:mass_assigned])
  respond_to do |format|
    if @post.save
      format.html
    else
      format.html
    end
  end
end

Но это возвращает ошибку нулевого объекта. Вероятно, это связано с тем, что моя форма использует check_box_tag, а не check_box с отличной магией и приводит к тому, что :mass_assigned равен нулю. Я довольно новичок в рельсах и был бы признателен за любые наводки, чтобы заставить это работать. Пожалуйста, объясните, как отформатировать мой метод для сбора отдельных параметров, а затем сохранить его.


person oprogfrogo    schedule 09.10.2010    source источник


Ответы (2)


Я не уверен, что ваша проблема заключается в том, чтобы просто сохранить объект или вы хотите его сериализовать, и ваша проблема в том, что ваш «вложенный массив», который вы хотите внедрить в базу данных, сглаживается перед сохранением или чем-то еще.

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

throw params

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

Если это второй случай, то дайте мне знать, и я свяжусь с вами;)

person socjopata    schedule 08.08.2011

Я сам боролся с этим целый день. Если вы все еще ищете ответ, и если я правильно понимаю ваш вопрос, попробуйте следующий пример:

а) Используйте шаблоны для имени человека: адрес строки: текст, чтобы настроить модель, представления и др.

b)

In app/models/person.rb:
class Person < ActiveRecord::Base
        attr_accessible :address, :name
    serialize :address
end

Представление скаффолдинга имеет один и тот же партиал _form для новых и редактируемых представлений. Вы можете добиться успешного завершения действий new и show, поместив в форму следующий код:

<%= form_for(@person) do |f| %>
 ...
      <%= f.fields_for :address do |address_fields| %>
        Street  : <%= address_fields.text_field :street %>
        Zip code: <%= address_fields.text_field :zip_code %>
      <% end %>
...
<% end %>

Однако представление редактирования не будет заполнять текстовые поля значениями из модели с приведенным выше кодом. Чтобы решить эту проблему, вам нужно извлечь значение из хэша @person.address и явно присвоить его тексту. Если вы используете скаффолд-представления, то форма обычно отображается с использованием партиала _form. Это усложняет ситуацию, потому что добавление кода для извлечения значения компонентов адреса не работает для нового объекта. Вы можете обойти это, инициализировав хэш адреса во время Person.new или проверив наличие нуля, как показано ниже:

  <%= f.fields_for :address do |address_fields| %>
    Street  : <%= address_fields.text_field :street,:value => @person.address.nil? ? "":@person.address["street"] %>
    Zip code: <%= address_fields.text_field :zip_code,:value => @person.address.nil? ? "":@person.address["zip_code"] %>
  <% end %>

Надеюсь, это поможет.

person Community    schedule 13.12.2011