从一种形式的轨道保存到多个模型
在过去的几周里,我一直在进入轨道,并且遇到了一个我找不到答案的问题。我觉得这可能是一件非常简单的事情,但这会让我发疯,所以我希望得到一点指导......从一种形式的轨道保存到多个模型
我将数据从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。
我在这里考虑的越多,我认为我可能会错过一个步骤,如果任何人有第二个,我会很感激听到你的思想过程。
感谢
我认为你在表单中有语法错误。 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 %>
Venue
模型需要指定哪些属性质量分配,包括Event
属性。
attr_accessible :event_attributes, :address_1, :address_2, :capacity # ...
感谢您的回应...仍然有一些麻烦,虽然..我改变了下面,但我仍然看到同样的问题。 // class Venue
好的谢谢,所以我加了“f”。在fields_for前面并且使事件复数化。当我重新加载我的表单时,text_field不会生成。对你来说这是否暗示模型没有正确设置,并且没有找到场地和事件之间的关系?它仅仅以FYI的形式既没有产生事件,也没有产生事件。谢谢 – brent 2012-02-18 17:15:38
我有一种感觉,我的问题与我的路线有关,可能是不正确的,我现在正在研究。 – brent 2012-02-18 17:33:25
使用每个模型的资源应该工作。我建议你看我发布的截屏视频,Ryan的解释非常简单,可以按照 – bruno077 2012-02-18 22:31:26