2016-03-24 8 views
0

Ich habe ein Formular für mein GameDate-Modell und das RefereeStat-Modell verschachtelt. Sie sind mit has_many association verbunden. Ohne Verschachtelung sparen beide Modelle. Aber in verschachtelter Form speichert meine App sie nicht. Ich vermute, dass das Problem in Form ist, wahrscheinlich in Verbindung mit Vitrine Controller, aber ich kann es nicht herausfinden.Warum funktioniert mein verschachteltes Formular nicht?

Dies ist Ausgabe von der Konsole:

POST Started "/ game_dates" für 127.0.0.1 bei 2016.03.24 20.38.07 0.100 Verarbeitung von GameDatesController # erstellen als HTML-Parameter: { "UTF-8" => "✓", "authenticity_token" => "umpbTCZekqIU/g6uVdlde9fSubutgLk0Qrbb0e5GCdn3qj4/C0tmlxl/akxaM1Vmr6v8dNB8b88ATpRN8v1U2g ==", "game_date" => { "date (1 i)" => "2016", das Datum“(2i) "=>" 3 "," Datum (3i) "=>" 24 ", " referee_stats_attributes "=> {" 0 "=> {" games_count "=>" 3 ", " showcase_id "=>" 10 "}}}," commit "=>" Spieldatum erstellen "} User Load (0.8ms) SELECT "Benutzer". * FROM "Benutzer" WHERE "Benutzer". "ID" = $ 1 ORDER BY "Benutzer". "ID" ASC LIMIT 1 [["ID", 1]] (0.4ms) BEGIN (0.3ms) ROLLBACK Showcase Laden (0.8ms) SELECT "showcases". * Von "showcases" Gerendert game_dates/_form.html.haml (22.4ms) Gerendert game_dates/new.html.haml in Layouts/Anwendung (23,9ms)
Gerenderte Layouts/_header.html.haml (0,7ms) Gerendert shared/_flash.html.haml (0,2ms) Fertig 200 OK in 148ms (Views: 138.5ms | Active: 2,2 ms)

Dies ist GameDate Modell:

class GameDate < ActiveRecord::Base 

    validates :date, presence: true 

    has_many :referee_stats 
    accepts_nested_attributes_for :referee_stats, :reject_if => :all_blank 
end 

Spiel Datum Controller:

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 

Schiedsrichter stat Modell:

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 

Form:

.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

ersetzen Sie 'f.simple_fields_for: referee_stats do | r |' mit 'f.simple_fields_for @ game_date.referee_stats do | r |' Es sollte funktionieren. –

+0

ODER nur das Entfernen von "@ game_date.referee_stats.build" im Controller löst diese Situation ebenfalls. –

+0

@MuhammadYawarAli, wenn ich die Felder '@ game_date.referee_stats.build' für referee_stats deasapear entfernt habe. Wenn ich mein Formular mit Ihrer ersten Empfehlung ändere, habe ich diesen Fehler erhalten "undefinierte Methode' has_attribute? ' für # " – Nekron

Antwort

1

ich in Ihrem git Code gesucht und gefunden Lösung:

Sie passieren nicht game_date_id von der game_date neue Form und es bei game_date_id Präsenz Validierung fehlgeschlagen und Ihnen nicht erlaubt Datensatz so zu speichern, ist es besser zu verwenden Association Name Validierung zu sicherzustellen, Anwesenheit von Rekord.

Tatsächlich Anwesenheitsvalidator für Fremdschlüssel ist nicht über Datensatz Existenz. Das bedeutet, dass Sie die game_date_id aus dem Formular übergeben können.

Ändern Sie die folgende Zeile in referee_stat.rb & es wird für Sie arbeiten:

validates :game_date_id, presence: true 
    replace with 
validate :game_date 
    OR 
validates :game_date, presence: true, if: -> {game_date_id.present?} 

Fremdschlüssel Validieren und den Verein selbst bei erklärt werden diese blog.

+0

Vielen Dank, ich schätze Ihre Hilfe sehr. Jetzt funktioniert es gut. – Nekron

0

Derzeit Ihre referee_stats_attributes sind wie solche übergeben:

"referee_stats_attributes"=>{"0"=>{"games_count"=>"3", "showcase_id"=>"10"}} 

Aber sie sollte wie folgt übergeben werden:

"referee_stats_attributes"=>[{"games_count"=>"3", "showcase_id"=>"10"}] 

Die id "0" ist nicht erforderlich; Rails magic erstellt das automatisch für dich. Sie müssen nur eine ID zu übergeben, wenn Sie aktualisieren, und selbst dann sollte es wie so übergeben werden:

"referee_stats_attributes"=>[{"id" => 1, "games_count"=>"3", "showcase_id"=>"10"}] 

ich verwendet habe, nicht simple_form_for so äußern kann nicht auf der Syntax, weil es in Ordnung aussieht. ..aber überprüfen Sie die HTML-Ausgabe, Ihr <input> für die untergeordneten Objekte sollte wie folgt aussehen:

<input name="referee_stats[][games_count]" ... /> 
<input name="referee_stats[][showcase_id]" ... /> 
Verwandte Themen