Простая вложенная форма, но, похоже, не работает - PullRequest
1 голос
/ 05 февраля 2011

Я пытаюсь создать простую вложенную форму, проверяя множество ресурсов в Интернете, но не могу найти, что мне не хватает! У меня есть следующее:

class Configuration < ActiveRecord::Base
  has_many :configoptions
  accepts_nested_attributes_for :configoptions
end

class Configoption < ActiveRecord::Base
  belongs_to :configuration
  has_many :items
end

Теперь я пытаюсь создать простую форму при выборе конфигурации, чтобы она отображала принадлежащие ему конфигурации, но ничего не работает!

Это представление без HTML

  <%= form_for :config do |f| %>
    <%= f.text_field(:name)%>
    <% f.fields_for @options do |option|%>
    <% end %>
  <% end %>

В контроллере у меня есть:

  def show
    @config = Configuration.find(params[:id])
    @options = @config.configoptions
  end

Но я получаю сообщение об ошибке:

undefined method `model_name' for Array:Class

У кого-нибудь есть советы для меня? Большое спасибо!

Ответы [ 4 ]

3 голосов
/ 15 августа 2011

К вашему сведению, Райан Бейтс (RailsCasts) создал драгоценный камень, чтобы справиться с большей частью этого.Я использую его сейчас, и он прекрасно работает!

Подробнее см. https://github.com/reu/simple_nested_form.

2 голосов
/ 05 февраля 2011

Вам нужно будет указать имя модели, если вы используете коллекцию (например, массив).

  <%= form_for :config do |f| %>
    <%= f.text_field(:name)%>
    <%= f.fields_for :configoptions, @options do |option|%>
      <%= option.text_field(:some_attribute) %>
    <% end %>
  <% end %>

В fields_for я передаю два аргумента, :configoptions в качестве имени модели и @options как коллекция для использования.http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html имеет массу примеров превосходных вложенных атрибутов, если вы прокрутите вниз чуть выше половины пути.

В качестве альтернативы (и мой личный предпочтительный метод) нужно перебрать коллекцию и вызвать fields_for для каждого объекта.

  <%= form_for :config do |f| %>
    <%= f.text_field(:name)%>
    <% @options.each do |configoption| %>
      <%= f.fields_for configoption do |option|%>
        <%= option.text_field(:some_attribute) %>
      <% end %>
    <% end %>
  <% end %>
1 голос
/ 21 мая 2012

Попробуйте:

class Configuration < ActiveRecord::Base
  has_many :configoptions, :dependent => :destroy
  accepts_nested_attributes_for :configoptions, :allow_destroy => true
end
0 голосов
/ 23 марта 2011

Вы использовали:

<% f.fields_for @options do |option|%>

попробуйте использовать

<%= f.fields_for @options do |option|%>

У меня была та же проблема, она была решена этой тривиальной идеей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...