2011-02-05 6 views
1

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

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

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

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

Это мнение без 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 

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

ответ

3

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

Для получения более подробной информации см. https://github.com/reu/simple_nested_form.

2

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

<%= 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 %> 
+0

Благодаря Адам. Когда я попробую второй метод, который вы предложили, я действительно получаю то, что мне нужно, поскольку перечислены все различные параметры. Однако по первому, по какой-то причине это не так. В моих вариантах некоторые будут выпадающими списками, которые пользователь сможет выбрать. Есть ли способ предложить метод, как только я нажму кнопку отправки, чтобы создать новую конфигурацию с параметрами, выбранными в форме? Как вы думаете? Большое спасибо! – Lievcin

+0

Эй, 'accepts_nested_attributes' должен работать над созданием конфигурации с выбранными параметрами. В вашем контроллере вам просто нужно иметь '@conf = Configuration.build (params [: config]); @ conf.save' для создания конфигурации и вложенных объектов опций конфигурации. Позвольте мне знать, если это то, что вы ищете. – Adam

0

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

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

попробовать с помощью

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

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

+3

Отсутствие вывода не приведет к появлению рельсов, в которых говорится: «неопределенный метод' model_name »для Array: Class" –

1

Try:

class Configuration < ActiveRecord::Base 
    has_many :configoptions, :dependent => :destroy 
    accepts_nested_attributes_for :configoptions, :allow_destroy => true 
end 
Смежные вопросы