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 %>
答案 0 :(得分:1)
通常,当表单中的所有表单元素具有相同名称时,会发生此行为。然后他们都会被提交,但是最后一个会覆盖所有其他的(如果你知道我的意思,实际上每个后续的一个会覆盖前一个)。所以最后一个获胜。要查看是否是这种情况,您可以检查Rails日志并查看POST请求以及参数。他们都有相同的名字吗?或者您可以检查您的表单并确保它们都是唯一的名称。
您希望HTML中的内容对于表单元素是这样的:
name="user[forecase_attributes][][level]"
和不
name="user[forecast_attribues][level]"
我喜欢在这些情况下使用Cocoon Gem,然后在您的情况下,您可以动态地将预测添加到您的页面中(并且不必准备三个)。 gem为您处理所有参数命名,删除等。希望它有所帮助...