我觉得我对下面的正确的道路上,虽然我不能将表单数据保存到模型。 我有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
要创建一个新的预测记录我有一个形式搜集了所有的灯具和预填充表单,用户将只需添加旁边的每个球队成绩
<%= form_for @prediction do |f| %>
<!-- Gets all fixtures -->
<%= f.fields_for :fixtures, @fixtures<!-- grabs as a collection --> do |ff| %>
<%= ff.text_field :home_team %> VS <%= ff.text_field :away_team %><%= f.text_field :home_score %><%= f.text_field :away_score %><br>
<% end %>
<%= f.submit 'Submit Predictions' %>
<% end %>
然后,我有我的控制采取新/创建行动,我想照顾是我可能会翻倒
class PredictionsController < ApplicationController
def new
@prediction = Prediction.new
@prediction.fixtures.build
@fixtures = Fixture.all
end
def create
@prediction = Prediction.new(params[:prediction])
@prediction.save
if @prediction.save
redirect_to root_path, :notice => '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
到Fixture.all
新方法在预测控制器,你是包括每个灯具,不只是属于你的预测灯具。 当窗体的结果传递到创建控制器有与传递等的预测中,是已报告的错误的源相关联的灯具。 也许你想要的东西,像@fixtures = @prediction.fixtures
。
你在做什么在fields_for
块也显得颇为错了我的眼睛。 您正在使用f.text_field
您home_score
和away_score
投入。 这将重复相同的形式元件在每个夹具场预测模型。 你不会得到你从这个想要的结果。 说实话,我努力理解这种关联是如何有意义。 您能更好一点解释呢? 我怀疑是你的模型没有完全建立,你需要他们的方式。
编辑:
OK,我想我有你想现在达到什么更好的主意。 你试图以某种形式创造出许多预测和预填充从现有灯具的列表HOME_TEAM和AWAY_TEAM,对不对?
好吧,假设是这样,你绝对接近了错误的方式。 你并不需要你的预测和夹具模型之间的多到一的关系(如您已正确地推测)。 你需要做的是通过迭代灯具的收集和填充生成表单home_team
和away_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]" %><br />
<% end %>
<%= submit_tag "Submit predictions" %>
<% end %>
所以基本上我要创建一个返回的参数数组的形式。 我不能在这种情况下使用该模型的形式助手。
解决此问题的方法是创建一个HAS_MANY预测的假人模型,并使用此创建嵌套表格。
无论如何,这是一个很大的,可能永远不会看,所以我要离开它有现在未经测试的代码。
我没有花很多时间看,因为我的妻子让我尽快离开。 但是,如果我理解正确的事情每个排在你看来是从夹具和预测模型关联。 您得到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"}
所以,你必须获得更多的逻辑在你创建方法在你的预测控制器通过您收到的哈希值进行迭代并保存每行一次一个。