2010-10-23 3 views
0

Я рельсы и рубин нуб, и Im уверен, что это что-то совершенно глупо я пропускаю ..вложенных форм объекта

Попытки построить вложенную форму, и нашли много примеров в Интернете, и пытались и не для воспроизведения желаемого результата.

поля "продавец" даже не отображается, и когда я отправить форму я получаю:

Неизвестный атрибут: Пункт

модели:

class Dealerform < ActiveRecord::Base 
belongs_to :dealer 
has_one :seller :class_name => 'Seller' 
has_many :items, :through => :seller 
accepts_nested_attributes_for :seller, :items 

end 

class Seller < ActiveRecord::Base 
belongs_to :dealerform 
has_many :items :class_name => 'Item' 
end 

class Item < ActiveRecord::Base 
belongs_to :seller 
end 

вид:

<% form_for(@dealerform) do |f| %> 
<%= f.error_messages %> 
<p> 
<%= f.label :date %><br /> 
<%= f.datetime_select :date %> 
</p> 
     #...more fields ... 

<% f.fields_for :seller do |seller| %> 

<p> 
<%= seller.label :fname %><br /> 
<%= seller.text_field :fname %> 
</p> 
     #...more fields ... 

<% end %> 

<% f.fields_for :item do |item| %> 
    <p> 
    <%= item.label :foo %><br /> 
    <%= item.text_field :foo %> 
    </p> 
     #...more fields ... 

<% end %> 

<%= f.submit 'Create' %> 
<% end %> 

основе предложений .. изменил следующие строки:

<% f.fields_for :seller do |seller| %> 
<% f.fields_for :item do |item| %> 

в:

<% f.fields_for @seller do |seller| %> 
<% f.fields_for @item do |item| %> 

и теперь они появляются в форме, и при попытке отправить форму я получаю:

неизвестный атрибут: nil_class

при изменении:

def new 
    @dealerform = Dealerform.new 

к:

def new 
    @dealerform = Dealerform.new 
    @dealerform.seller.build 

я получаю:

неопределенный метод `сборки» для ноль: NilClass

+0

Подсказки: Пожалуйста, не начинайте предложения с «так». Пожалуйста, начните приговоры с помощью Capital Letters. Процитируйте «Я». –

+0

Напоминание - если вы работаете в Rails 3.0.0 или 2.3.9, убедитесь, что обновили его, так как существует уязвимость [http://weblog.rubyonrails.org/2010/10/15/security -vulnerability-in-embedded-attributes-code-in-ruby-on-rails-2-3-9-and-3-0-0) для 'accepts_nested_attributes_for'. – Matchu

ответ

2

Это потому, что fields_for атрибут wil только дисплей r которые существуют. В вашем контроллере вам нужно создать объекты для форм, которые будут содержать.

Таким образом, в вашем контроллере

def new 
    #2.times {@dealer_form.items} 
    @dealer_form = DealerForm.new 
    @dealer_form.seller = Seller.new 
    #or @dealer_form.seller.build 
end 
+0

сделал это изменение и теперь получил: undefined метод 'build 'для nil: NilClass – sysconfig

+0

Это просто означает, что вы строите то, чего не существует. – s84

+0

Проверьте свои ассоциации. У вас слишком много для меня, чтобы пройти через каждого, и если бы я это сделал, я не уверен, что вы все правильно заявили. Просто убедитесь, что продавцы на самом деле has_many и так далее ... :) – s84

0

Похоже, ваши dealerform элементов модели has_many, но ваш fields_for является подав особую позицию, поэтому, когда он пытается инициализировать dealerform в создании действия он пытается присвоить dealerform. но нет такого метода. Если у дилера есть много предметов, вы можете проверить этот пример http://media.pragprog.com/titles/fr_arr/multiple_models_one_form.pdf, как управлять has_many в одной форме.

0

Как указано Сэм, вы определены, чтобы иметь реальный объект, будь то новые или существующие:

f.fields_for @seller

Вы можете получить @seller несколькими различными способами, используя build, чтобы создать новый, или если вы редактируют существующую запись, используйте @dealerform.seller.

В случае предметов вам может потребоваться цикл над несколькими, в зависимости от того, сколько форм вы хотите отобразить. Отъезд http://www.railscasts.com для некоторых скринкастов на этом.

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