Rails nested_form而不保存父模型

时间:2014-07-08 13:06:02

标签: jquery ruby-on-rails ajax nested-forms

我有两种模式:

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,然后点击页面上的“保存”按钮。我不明白如何制定解决方法?我应该开始交易吗?但是如果用户关闭窗口(而不是单击取消),我怎么能回滚呢?

0 个答案:

没有答案