nested_form没有保存到模型Rails 3

虽然我无法将表单数据保存到模型中,但我认为我正处于以下方面。 我有2个型号

class Prediction < ActiveRecord::Base attr_accessible :home_team, :away_team, :home_score, :away_score, :fixtures_attributes has_many :fixtures accepts_nested_attributes_for :fixtures end class Fixture < ActiveRecord::Base attr_accessible :home_team, :away_team, :fixture_date, :kickoff_time belongs_to :predictions end 

为了创建一个新的预测记录,我有一个表单可以获取所有的灯具并预先填充表单,用户只需在每个团队旁边添加分数

   <%= f.fields_for :fixtures, @fixtures do |ff| %>  VS 

然后我让我的控制器来处理新的/创建动作,我认为这是我可能会摔倒的地方

 class PredictionsController  'Predictions Submitted Successfully' else render 'new' end end end 

最后我的路线

 resources :predictions resources :fixtures 

因此,当我提交表单时,我收到错误

 ActiveRecord::RecordNotFound in PredictionsController#create Couldn't find Fixture with ID=84 for Prediction with ID= 

查看被解析​​的params(下面的快照),看起来不对,因为home_score和away_score没有通过。

 {"utf8"=>"✓", "authenticity_token"=>"DfeEWlTde7deg48/2gji7zSHJ19MOGcMTxEsQEKdVsQ=", "prediction"=>{"fixtures_attributes"=>{"0"=>{"home_team"=>"Arsenal", "away_team"=>"Norwich", "id"=>"84"}, "1"=>{"home_team"=>"Aston Villa", "away_team"=>"Fulham", "id"=>"85"}, "2"=>{"home_team"=>"Everton", "away_team"=>"QPR", "id"=>"86"} 

表格的当前输出

图片

任何建议表示赞赏

谢谢

当您在预测控制器中的新方法中将@fixtures设置为@fixtures ,您将包括每个夹具,而不仅仅是属于您的预测的夹具。 当表单的结果传递给创建控制器时,存在与传递的其他预测相关联的灯具,这是您报告的错误的来源。 也许你想要像@fixtures = @prediction.fixtures这样的东西。

你在fields_for块中所做的fields_for对我来说看起来也是错误的。 您正在使用f.text_field作为home_scoreaway_score输入。 这将为每个夹具区域中的预测模型重复相同的表单元素。 你不会从中得到你想要的结果。 说实话,我很难理解这种关联是如何理解的。 你能解释一下好一点吗? 我怀疑你的模型并不像你需要的那样完整。

编辑:

好吧,我想我对你现在想要达到的目标有了更好的了解。 您试图在一个表单中创建许多预测,并从现有灯具列表中预填充home_team和away_team,对吧?

好吧,假设是这样,你肯定是以错误的方式接近它。 您不需要预测和夹具模型之间的多对一关系(正如您所推测的那样)。 您需要做的是通过迭代灯具集合并从当前灯具实例填充home_teamaway_team字段来生成表单。 你真的需要这些是可编辑的文本字段,还是只是将它们放在文本字段中以便它们通过? 如果是这样,您可以使用隐藏字段。

现在的问题是,Rails不容易在一个表单中创建多个记录。 这不是我以前做过的事情,它会花费我相当多的尝试和错误来使它工作,但这是一种最好的猜测,一种方法来做到这一点。

 models class Prediction < ActiveRecord::Base attr_accessible :home_team, :away_team, :home_score, :away_score, :fixtures_attributes end class Fixture < ActiveRecord::Base attr_accessible :home_team, :away_team, :fixture_date, :kickoff_time end 

 controller class PredictionsController < ApplicationController def new @prediction = Prediction.new @fixtures = Fixture.all end def create begin params[:predictions].each do |prediction| Prediction.new(prediction).save! end redirect_to root_path, :notice => 'Predictions Submitted Successfully' rescue render 'new' end end end 

 view <%= form_tag controller: 'predictions', action: 'create', method: 'post' do %> <% @fixtures.each do |fixture| %> <%= fixture.home_team %> vs <%= fixture.away_team %> <%= hidden_field_tag "predictions[][home_team]", fixture.home_team %> <%= hidden_field_tag "predictions[][away_team]", fixture.away_team %> <%= text_field_tag "predictions[][home_score]" %> <%= text_field_tag "predictions[][away_score]" %>
<% end %> <%= submit_tag "Submit predictions" %> <% end %>

所以基本上我正在创建一个返回参数数组的表单。 在这种情况下我无法使用模型表单助手。

解决这个问题的一种方法是创建一个具有多个预测的虚拟模型,并使用它创建一个嵌套的表单。

无论如何,这是许多未经测试的代码,可能永远不会被看到,所以我现在要把它留在那里。

我没有花很多时间看,因为我的妻子很快就让我离开了。 但是如果我理解了你的视图中的每一行都是来自灯具和预测模型关联。 你得到的params哈希是一团糟,因为默认行为将是一个更新单个记录ID的视图。 因此,您将多个记录放入单个视图中,并尝试一次更新多个记录。

您的模型中的创建方法

 @prediction = Prediction.new(params[:prediction]) 

但你传递的params散列是这样的:

 {"utf8"=>"✓", "authenticity_token"=>"DfeEWlTde7deg48/2gji7zSHJ19MOGcMTxEsQEKdVsQ=", "prediction"=>{"fixtures_attributes"=>{"0"=>{"home_team"=>"Arsenal", "away_team"=>"Norwich", "id"=>"84"}, "1"=>{"home_team"=>"Aston Villa", "away_team"=>"Fulham", "id"=>"85"}, "2"=>{"home_team"=>"Everton", "away_team"=>"QPR", "id"=>"86"} 

因此,您必须在预测控制器中的create方法中获得更多逻辑,以迭代您正在接收的哈希并一次保存一行。