3

在過去的幾周裏,我一直在進入軌道,並且遇到了一個我找不到答案的問題。我覺得這可能是一件非常簡單的事情,但這會讓我發瘋,所以我希望得到一點指導......從一種形式的軌道保存到多個模型

我將數據從1表格插入到2個模型中。一個模型叫做Venue,一個模型叫做Events。這是一個多對一的場合,多場比賽場地有多場比賽。

機型:

class Venue < ActiveRecord::Base 
    has_many :events 
    accepts_nested_attributes_for :events 
end 

class Event < ActiveRecord::Base 
    belongs_to :venue 

    scope :upcoming, where('date >= ?', Date.today) 
end 

控制器:

class EventsController < ApplicationController 

def new 
     @venue = Venue.new 
end 

def create 

@venue = Venue.new(params[:venue]) 

    if @venue.save 
     render :inline => "Success" 
    else 
     render('new') 
    end 
end 

end 

形式:

<%= form_for(@venue, :url =>{:action => 'create'}) do |f| %> 

     Artist ID<br /> 
     <%= fields_for :event do |event_fields| %> 
      <%= event_fields.text_field :artist_id %><br/><br /> 
     <% end %> 

     Venue City<br /> 
     <%= f.text_field(:city) %> <br /><br /> 
     Venue Name<br /> 
     <%= f.text_field(:name) %><br/><br/> 


     <div class="actions"> 
      <%= submit_tag "Save", :class => "btn primary" %> 
     </div> 

<% end %> 

日誌輸出:

Started POST "/events" for 127.0.0.1 at 2012-02-17 19:57:24 -0500 
Processing by EventsController#create as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"p3llx5KsYn6gyjP9g2qwzXr+0rjh3h/o34h/iqvqjRo=", "event"=>{"artist_id"=>"124"}, "venue"=>{"city"=>" Boston", "name"=>"Bostons Fa'v"}, "commit"=>"Save"} 
(0.2ms) BEGIN 
SQL (0.8ms) INSERT INTO "venues" ("address_1", "address_2", "capacity", "city", "country", "created_at", "created_by", "name", "state", "updated_at", "url", "zip") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING "id" [["address_1", nil], ["address_2", nil], ["capacity", nil], ["city", " Boston"], ["country", nil], ["created_at", Sat, 18 Feb 2012 00:57:24 UTC +00:00], ["created_by", nil], ["name", "Bostons Fa'v"], ["state", nil], ["updated_at", Sat, 18 Feb 2012 00:57:24 UTC +00:00], ["url", nil], ["zip", nil]] 
(0.4ms) COMMIT 
Rendered inline template (0.2ms) 
Completed 200 OK in 5ms (Views: 0.6ms | ActiveRecord: 1.4ms) 

正如你可以看到它沒有失敗,但它只提交給1模型。我的理解是,通過添加「accep_nested_attributes_for:events」,Venue模型知道然後進入我的Events表,使用我提供的事件數據創建一個新事件(在本例中只是artist_id),然後自動插入我的id字段場地表入venue_id。

我在這裏考慮的越多,我認爲我可能會錯過一個步驟,如果任何人有第二個,我會很感激聽到你的思想過程。

感謝

回答

1

我認爲你在表單中有語法錯誤。 fields_for是f的一個方法,它需要複數個符號。這也是一個很好的做法,在單數塊的迭代器,而不是使用括號當你的方法只需要一個參數:

<%= form_for(@venue, :url =>{:action => 'create'}) do |f| %> 

     Artist ID<br /> 
     <%= f.fields_for :events do |event_field| %> 
      <%= event_field.text_field :artist_id %><br/><br /> 
     <% end %> 

     Venue City<br /> 
     <%= f.text_field :city %> <br /><br /> 
     Venue Name<br /> 
     <%= f.text_field :name %><br/><br/> 


     <div class="actions"> 
      <%= submit_tag "Save", :class => "btn primary" %> 
     </div> 

<% end %> 

Ryan Bate's Railscasts嵌套形式的這個例子:

<%= form_for @survey do |f| %> 
    <%= f.error_messages %> 
    <p> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </p> 
    <% f.fields_for :questions do |builder| %> 
    <p> 
    <%= builder.label :content, "Question" %><br /> 
    <%= builder.text_area :content, :rows => 3 %> 
    </p> 
    <% end %> 
    <p><%= f.submit "Submit" %></p> 
<% end %> 
+0

好的謝謝,所以我加了「f」。在fields_for前面並且使事件複數化。當我重新加載我的表單時,text_field不會生成。對你來說這是否暗示模型沒有正確設置,並且沒有找到場地和事件之間的關係?它僅僅以FYI的形式既沒有產生事件,也沒有產生事件。謝謝 – brent 2012-02-18 17:15:38

+0

我有一種感覺,我的問題與我的路線有關,可能是不正確的,我現在正在研究。 – brent 2012-02-18 17:33:25

+0

使用每個模型的資源應該工作。我建議你看我發佈的截屏視頻,Ryan的解釋非常簡單,可以按照 – bruno077 2012-02-18 22:31:26

0

Venue模型需要指定哪些屬性質量分配,包括Event屬性。

attr_accessible :event_attributes, :address_1, :address_2, :capacity # ... 
+0

感謝您的迴應...仍然有一些麻煩,雖然..我改變了下面,但我仍然看到同樣的問題。 // class Venue brent 2012-02-18 04:51:02