使用一个表单创建多个新记录,仅保存最后一个记录

时间:2013-08-04 16:15:27

标签: ruby-on-rails ruby-on-rails-3.2

Rails新手在这里!我正在尝试创建一个允许用户在一个页面上添加多个预测的表单。 (理想情况下,您可以一次输入整周的预测。)在应用程序中,两个模型是嵌套的。 (您只能通过用户访问预测。)

我根据this响应(也观看了Railscast#196)广告修改了预测表单和控制器,而表单现在将构建我需要的任何预测对象,它只保存最后一个。我错过了什么?或者我误解了什么?任何帮助真的很感激!我正在使用Rails 3.2.6:

class Forecast < ActiveRecord::Base
attr_accessible :castdate, :level, :user_id

belongs_to :user



class User < ActiveRecord::Base
attr_accessible :defaultcast, :email, :password, :username, :name, :forecast_attributes

has_many :forecasts

accepts_nested_attributes_for :forecasts

在预测控制器中:

def new
@user = User.find(params[:user_id])
@forecast = @user.forecasts.build
@forecasts = Array.new(3) { @user.forecasts.build }

respond_to do |format|
  format.html # new.html.erb
  format.json { render json: @forecast }
end
end

预测_form:

<%= form_for(:forecasts, :url => user_forecasts_path(@user)) do |f| %>

(我尝试使用上面链接响应中建议的form_for([@ user,:forecast])但收到此错误:符号:类的未定义方法`model_name'

<% @forecasts.each do |forecast| %>
<%= fields_for forecast do |r| %>

<div class="field">
    <%= r.label "Date" %><br />
    <%= r.date_select :castdate, :start_year => Time.now.year,
:use_two_digit_numbers => true %>
</div>
<div class="field">
    <%= r.label "Grump Level" %><br />
    <%= r.number_field :level, :min => 0, :max => 10 %>
</div>    
<% end %>
  <% end %>
<div class="actions">
    <%= f.submit %>
</div>

<% end %>

1 个答案:

答案 0 :(得分:1)

通常,当表单中的所有表单元素具有相同名称时,会发生此行为。然后他们都会被提交,但是最后一个会覆盖所有其他的(如果你知道我的意思,实际上每个后续的一个会覆盖前一个)。所以最后一个获胜。要查看是否是这种情况,您可以检查Rails日志并查看POST请求以及参数。他们都有相同的名字吗?或者您可以检查您的表单并确保它们都是唯一的名称。

您希望HTML中的内容对于表单元素是这样的:

name="user[forecase_attributes][][level]"

name="user[forecast_attribues][level]"

我喜欢在这些情况下使用Cocoon Gem,然后在您的情况下,您可以动态地将预测添加到您的页面中(并且不必准备三个)。 gem为您处理所有参数命名,删除等。希望它有所帮助...