我有我的GameDate模型和RefereeStat模型的嵌套表单。它们与has_many关联相关联。没有嵌套,两个模型都在节省。但是在嵌套表格中,我的应用程序不会保存它们。我怀疑问题是形式的,可能与展示控制器有关,但我无法弄明白。
这是从控制台输出的:
在2016-03-24 20:38:07 +0100开始为127.0.0.1发布“/ game_dates” GameDatesController处理#create as HTML参数: { “UTF8”=> “中✓”, “authenticity_token”=> “中umpbTCZekqIU / g6uVdlde9fSubutgLk0Qrbb0e5GCdn3qj4 / C0tmlxl / akxaM1Vmr6v8dNB8b88ATpRN8v1U2g ==”, “game_date”=> {“date(1i)”=>“2016”,“date(2i)”=>“3”,“date(3i)”=>“24”, “referee_stats_attributes”=> { “0”=> { “games_count”=> “中3”, “showcase_id”=>“10”}}},“commit”=>“创建游戏日期”}用户加载 (0.8ms)SELECT“users”。* FROM“users”WHERE“users”。“id”= $ 1 ORDER BY“users”。“id”ASC LIMIT 1 [[“id”,1]](0.4ms)BEGIN(0.3ms) ROLLBACK Showcase Load(0.8ms)SELECT“showcases”。* FROM “showcases”渲染了game_dates / _form.html.haml(22.4ms)渲染 布局/应用程序中的game_dates / new.html.haml(23.9ms)
渲染的布局/ _header.html.haml(0.7ms)渲染 shared / _flash.html.haml(0.2ms)在148ms完成200 OK(浏览次数: 138.5ms | ActiveRecord:2.2ms)
这是GameDate模型:
class GameDate < ActiveRecord::Base
validates :date, presence: true
has_many :referee_stats
accepts_nested_attributes_for :referee_stats, :reject_if => :all_blank
end
游戏日期控制器:
class GameDatesController < ApplicationController
before_action :authenticate_user!
before_action :user_is_admin
def new
@game_date = GameDate.new
@game_date.referee_stats.build
end
def create
@game_date = GameDate.new(game_date_params)
if @game_date.save
redirect_to showcases_path
flash[:success] = "Game date created"
else
render 'new'
end
end
def show
@game_date = GameDate.find(params[:id])
end
def destroy
@game_date = GameDate.find(params[:id]).destroy
redirect_to root_url
flash[:success] = "Game date deleted"
end
private
def game_date_params
params.require(:game_date).permit(:date, referee_stats_attributes: [ :games_count, :showcase_id ])
end
def user_is_admin
unless current_user.admin?
flash[:error] = "You don't have permission to perform this action!"
redirect_to root_url
end
end
end
裁判员统计模型:
class RefereeStat < ActiveRecord::Base
validates :games_count, presence: true, numericality: {
only_integer: true,
greater_than_or_equal_to: 0 }
validates :showcase_id, presence: true
validates :game_date_id, presence: true
belongs_to :showcase
belongs_to :game_date
end
形式:
.container
.row
.col-md-6.col-md-offset-3
= simple_form_for @game_date do |f|
= f.error_notification
%h2.text-center Game date
= f.input :date
= f.simple_fields_for :referee_stats do |r|
%h3.text-center Referee statistics
= r.input :games_count
= r.association :showcase, label_method: :name, value_method: :id, include_blank: false
= f.button :submit, class: "btn btn-primary btn-sm"
答案 0 :(得分:1)
我查看了你的git代码并找到了解决方案:
您没有从game_date新表单及其传递game_date_id 在game_date_id存在验证失败并且不允许你 保存记录所以,最好使用关联名称验证 确保记录的存在。
实际上,外键的存在验证器不关心记录的存在。这意味着您可以从表单传递game_date_id。
更改referee_stat.rb&amp;中的以下行。它会对你有用:
validates :game_date_id, presence: true
replace with
validate :game_date
OR
validates :game_date, presence: true, if: -> {game_date_id.present?}
验证外键和关联本身的解释 这blog。
答案 1 :(得分:0)
目前您的int neighbors (int i0, int j0)
{
int imax = (i0 < SIZE) ? (i0 + 1) : SIZE;
int jmax = (j0 < SIZE) ? (j0 + 1) : SIZE;
int result = 0;
for (int i = (i0 > 0) ? (i0 - 1) : 0; i <= imax; i++)
{
for (int j = (j0 > 0) ? (j0 - 1) : 0; j <= jmax; j++)
{
if ((i != i0 || j != j0) && grid[i][j] != 0)
{
result++;
}
}
}
return result;
}
传递方式如下:
referee_stats_attributes
但他们应该像这样传递:
"referee_stats_attributes"=>{"0"=>{"games_count"=>"3", "showcase_id"=>"10"}}
不需要身份"referee_stats_attributes"=>[{"games_count"=>"3", "showcase_id"=>"10"}]
; Rails magic将为您自动创建此功能。如果你正在更新,你只需要传递一个id,即使这样,它也应该像这样传递:
"0"
我没有使用"referee_stats_attributes"=>[{"id" => 1, "games_count"=>"3", "showcase_id"=>"10"}]
因此无法评论语法,因为它看起来不错......但是检查HTML输出,您的simple_form_for
子对象应该看起来像这样:
<input>