2010-05-06 4 views
0

Я изо всех сил стараюсь разработать форму, которая позволит мне вводить данные для двух разных моделей. Форма для «инцидента», который имеет следующие соотношения:Как использовать вложенную форму для нескольких моделей в одной форме?

belongs_to    :customer 
belongs_to    :user 

has_one     :incident_status 

has_many    :incident_notes 
accepts_nested_attributes_for :incident_notes, :allow_destroy => false 

Так инцидент присвоенный «Клиент» и «User», и пользователь может добавить «Примечание» к инцидент. У меня возникли проблемы с частью примечаний формы. Вот как форма представляется:

{"commit"=>"Create", 
"authenticity_token"=>"ECH5Ziv7JAuzs53kt5m/njT9w39UJhfJEs2x0Ms2NA0=", 
"customer_id"=>"4", 
"incident"=>{"title"=>"Something bad", 
"incident_status_id"=>"2", 
"user_id"=>"2", 
"other_id"=>"AAA01-042310-001", 
"incident_note"=>{"note"=>"This is a note"}}} 

Оказывается, пытается добавить incident_note как поле под «инцидентом», а не создавать новую запись в таблице incident_note с incident_id внешнего ключа ссылки обратно Инцидент.

Вот 'IncidentNote' модель:

belongs_to :incident 
belongs_to :user 

Вот форма для 'Инцидент':

<% form_for([@customer,@incident]) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.label :other_id, "ID" %><br /> 
    <%= f.text_field :capc_id %> 
    </p> 
    <p> 
    <%= f.label :title %><br /> 
    <%= f.text_field :title %> 
    </p> 
    <p> 
     <%= label_tag 'user', 'Assign to user?' %> 
     <%= f.select :user_id, @users.collect {|u| [u.name, u.id]} %> 
    </p> 
    <p> 
     <%= f.label :incident_status, 'Status?' %> 
     <%= f.select :incident_status_id, @statuses.collect {|s| [s.name, s.id]} %> 
    </p> 
    <p> 
     <% f.fields_for :incident_note do |inote_form| %> 
     <%= inote_form.label :note, 'Add a Note' %> 
     <%= inote_form.text_area :note, :cols => 40, :rows => 20 %> 
     <% end %> 
    </p> 
    <p> 
    <%= f.submit "Create" %> 
    </p> 
<% end %> 

И, наконец, вот записи incident_controller для новых и Создать.

Новое:

def new 
    @customer = current_user.customer 
    @incident = Incident.new 
    @users = @customer.users 
    @statuses = IncidentStatus.find(:all) 
    @incident_note = IncidentNote.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @incident } 
    end 
    end 

Создать:

def create 
    @users = @customer.users 
    @statuses = IncidentStatus.find(:all) 
    @incident = Incident.new(params[:incident]) 
    @incident.customer = @customer 
    @incident_note = @incident.incident_note.build(params[:incident_note]) 
    @incident_note.user = current_user 

    respond_to do |format| 
     if @incident.save 
     flash[:notice] = 'Incident was successfully created.' 
     format.html { redirect_to(@incident) } 
     format.xml { render :xml => @incident, :status => :created, :location => @incident } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @incident.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

Я не совсем уверен, где искать в этой точке. Я уверен, что это просто ограничение моего нынешнего умения Rails (я мало знаю). Поэтому, если кто-то может указать мне в правильном направлении, я буду очень благодарен. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация!

Спасибо!

ответ

1

Проверьте api для метода fields_for и выделите раздел «один ко многим».

В вашей модели много :incident_notes, а не на один инцидент, поэтому он не понимает отношения и пытается найти поле с этим именем.

Так оно и должно быть:

<% f.fields_for :incident_notes do |inote_form| %> 
    <%= inote_form.label :note, 'Add a Note' %> 
    <%= inote_form.text_area :note, :cols => 40, :rows => 20 %> 
    <% end %> 

Он перебирает все incident_notes присвоенных инцидент и производит поля для каждого из них.
Вы также должны создать по крайней мере одну ноту в вас new действие, иначе не будет ни:

def new 
    @incident = Incident.new 
    @incident.incident_notes.build 
    # ... 
    end 
+0

Спасибо за ваш ответ. Думаю, это был вопрос. Теперь я получаю другие ошибки, потому что я потрудился с ним немного больше, поэтому пока не могу подтвердить. :) – Magicked

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