我有两种模式:
class Festival < ActiveRecord::Base
has_many :nominations
end
class Nomination < ActiveRecord::Base
belongs_to :festival
end
resources :festivals do
resources :nominations, :only => [:create, :destroy, :new, :index]
end
我希望有一个表单,用户可以在其中添加节日和提名。场景如下: 1.用户点击“新FEstival” 2.用户填写所有与节日相关的字段 3.点击“添加提名”,填写所有提名相关字段,点击保存提名 4.点击节日上的保存/取消。
我知道第3步应该是通过ajax,所以我创建了以下代码:
FestivalsController
def new
@festival = Festival.new
end
NominationsController
def new
festival = Festival.find(params[:festival_id])
@nomination = festival.nominations.build
end
_new_nomination表单
<%= form_for ([@festival, @nomination]), :html => { :class => 'form-horizontal' }, :remote => true do |f| %>
<div class="control-group">
<%= f.label :name, :class => 'control-label' %>
<div class="controls">
<%= f.file_field :name %>
</div>
</div>
<div class="form-actions">
<%= f.submit nil, :class => 'btn btn-primary' %>
<%= link_to t('.cancel', :default => t("helpers.links.cancel")),
new_nomination_path, :class => 'btn' %>
</div>
<% end %>
但是我得到形式中的第一个参数不能包含nil或为空,因为@nomination是空的。我做错了什么?
更新1
我修改了我的代码:
FestivalsController
def new
@festival = Festival.new
@festival.save
end
_new_nomination表单
<%= form_for ([@festival, @festival.nominations.build]), :html => { :class => 'form-horizontal' }, :remote => true do |f| %>
<div class="control-group">
<%= f.label :name, :class => 'control-label' %>
<div class="controls">
<%= f.text_field :name %>
</div>
</div>
<div class="form-actions">
<%= f.submit nil, :class => 'btn btn-primary' %>
<%= link_to t('.cancel', :default => t("helpers.links.cancel")),
new_festival_nomination_path(@festival), :class => 'btn' %>
</div>
<% end %>
使用该代码,我能够呈现表单,但正如您所见,我必须先保存Festival,然后点击页面上的“保存”按钮。我不明白如何制定解决方法?我应该开始交易吗?但是如果用户关闭窗口(而不是单击取消),我怎么能回滚呢?