1

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

我根据响应(也观看了 Railscast #196)广告修改了 Forecast 表单和控制器,而表单现在将构建我需要的任何 # 个 Forecast 对象,它只保存最后一个。我错过了什么?还是我误会了什么?非常感谢任何帮助!我正在使用 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, :forecasts]) 但收到此错误:未定义的方法 `model_name' for Symbol:Class )

<% @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 %>
4

1 回答 1

1

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

你想要的 HTML 中的表单元素是这样的:

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

不是

name="user[forecast_attribues][level]"

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

于 2013-08-04T20:04:36.270 回答