为什么我的嵌套表单不起作用?

时间:2016-03-24 20:15:45

标签: ruby-on-rails ruby-on-rails-4

我有我的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"

2 个答案:

答案 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>