2017-08-09 3 views
0

Ich versuche, meine Anwendung zu testen und ich immer die folgende Fehlermeldung erhalten:Resolving Active Record Befestigungsformatfehler

Error: 
    ContractsControllerTest#test_should_get_show: 
    ActiveRecord::Fixture::FormatError: ActiveRecord::Fixture::FormatError 

Error: 
    ContractsControllerTest#test_should_get_show: 
    NoMethodError: undefined method `each' for nil:NilClass 

Unten ist der Code auf meinem Vertrag Controller und ich habe einen ähnlichen Code wie diese auf allen Controllern .

def index 
     @contract = Contract.all.paginate(page: params[:page], :per_page => 70) 
    end 


    def show 
     @contract = Contract.find(params[:id]) 

    end 



    def new 
     @contract = Contract.new 
    end 


    def create 
     @contract = Contract.new(located) 
     if @contract.save 
      flash[:success] = "A record has been successfully added" 
     redirect_to contracts_path 
     else 
      render 'new' 
     end 
    end 



    def located 
     params.require(:contract).permit(:contract_name, :contract_status, :services_rendered, :contract_value, :award_year) 
    end 


     # editing a record in the contract from cotract table 
    def edit 
     @contract = Contract.find(params[:id]) 
    end 





     def update 
     @contract = Contract.find(params[:id]) 
     if @contract.update_attributes(located) 
      flash[:success] = "Contract form updated" 
      redirect_to contracts_path 
     else 
      render'edit' 
     end 
     end 



    def destroy 
     Contract.find(params[:id]).destroy 
     flash[:success] = "A record has been successfully deleted" 
     redirect_to contracts_path 
    end 

Im Folgenden die vollständige Spur des Fehlers ist, wenn ich die Befehls Schienen db laufen: Armaturen: load --trace

rails aborted! 
ActiveRecord::Fixture::FormatError: ActiveRecord::Fixture::FormatError 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-  
5.0.5/lib/active_record/fixture_set/file.rb:72:in `validate' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixture_set/file.rb:49:in `raw_rows' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord-  
5.0.5/lib/active_record/fixture_set/file.rb:37:in `config_row' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixture_set/file.rb:27:in `model_class' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixtures.rb:791:in `block (2 levels) in  
read_fixture_files' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixture_set/file.rb:15:in `open' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixtures.rb:790:in `block in read_fixture_files' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixtures.rb:789:in `each' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixtures.rb:789:in `each_with_object' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixtures.rb:789:in `read_fixture_files' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixtures.rb:598:in `initialize' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixtures.rb:529:in `new' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixtures.rb:529:in `block (2 levels) in  
create_fixtures' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixtures.rb:526:in `map' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixtures.rb:526:in `block in create_fixtures' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/connection_adapters/postgresql/referential_integrity.rb: 22:in `disable_referential_integrity' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/fixtures.rb:523:in `create_fixtures' 
/usr/local/rvm/gems/ruby-2.3.0/gems/activerecord- 
5.0.5/lib/active_record/railties/databases.rake:207:in `block (3 levels) in 
<top  (required)>' 
/usr/local/rvm/gems/ruby-2.3.0/gems/railties- 
5.0.5/lib/rails/commands/rake_proxy.rb:14:in `block in run_rake_task' 
/usr/local/rvm/gems/ruby-2.3.0/gems/railties- 
5.0.5/lib/rails/commands/rake_proxy.rb:11:in `run_rake_task' 
/usr/local/rvm/gems/ruby-2.3.0/gems/railties- 
5.0.5/lib/rails/commands/commands_tasks.rb:51:in `run_command!' 
/usr/local/rvm/gems/ruby-2.3.0/gems/railties- 
5.0.5/lib/rails/commands.rb:18:in `<top (required)>' 
/home/ubuntu/workspace/final_project/bin/rails:9:in `require' 
/home/ubuntu/workspace/final_project/bin/rails:9:in `<top (required)>' 
/usr/local/rvm/gems/ruby-2.3.0/gems/spring- 
2.0.2/lib/spring/client/rails.rb:28:in `load' 
/usr/local/rvm/gems/ruby-2.3.0/gems/spring- 
2.0.2/lib/spring/client/rails.rb:28:in `call' 
/usr/local/rvm/gems/ruby-2.3.0/gems/spring- 
2.0.2/lib/spring/client/command.rb:7:in `call' 
/usr/local/rvm/gems/ruby-2.3.0/gems/spring-2.0.2/lib/spring/client.rb:30:in  
`run' 
/usr/local/rvm/gems/ruby-2.3.0/gems/spring-2.0.2/bin/spring:49:in `<top 
(required)>' 
/usr/local/rvm/gems/ruby-2.3.0/gems/spring-  
2.0.2/lib/spring/binstub.rb:31:in `load' 
/usr/local/rvm/gems/ruby-2.3.0/gems/spring- 
2.0.2/lib/spring/binstub.rb:31:in`<top (required)>' 
/home/ubuntu/workspace/final_project/bin/spring:15:in `require' 
/home/ubuntu/workspace/final_project/bin/spring:15:in `<top (required)>' 
bin/rails:3:in `load' 
bin/rails:3:in `<main>' 
Tasks: TOP => db:fixtures:load 
(See full trace by running task with --trace) 

Meine Anwendung containts 12 Controller, tritt der gleiche Fehler in jedem der Controller. Außerdem habe ich 10 Tabellen in meinem Schema, von denen einige Referenzen/Beziehungen zueinander enthalten.

Ich weiß nicht wirklich was falsch ist und ich habe jetzt seit etwa vier Tagen mit diesem Problem zu kämpfen. Ich wäre dankbar, wenn mir jemand mit irgendeinem Code oder Informationen helfen könnte, die mir helfen könnten, die Ursache des Fehlers zu finden. Ich wäre auch dankbar, wenn Sie mir Informationen liefern könnten, wo genau ich den Code platzieren soll, um diesen Fehler zu verfolgen und zu beheben.

Dank

+0

Hat meine Antwort Ihnen geholfen, Ihr Problem zu lösen? In StackOverflow sollten Sie Feedback zu den Antworten geben, die Sie erhalten, insbesondere wenn sie Ihnen helfen. Wenn eine Antwort Ihr Problem löst, sollten Sie die Antwort als akzeptiert markieren, damit andere mit dem gleichen Problem die Lösung finden. – DRSE

+0

Auch habe ich festgestellt, dass Sie das gleiche Problem dreimal letzte Woche mit leicht unterschiedlichen Details zu jedem Beitrag (hier https://stackoverflow.com/questions/45580331/active-record-fixture-format-error und hier https://stackoverflow.com/questions/45473138/active-record-fixture-format-error), und folgte keinem von ihnen. Du solltest das nicht tun; Stattdessen sollten Sie den ursprünglichen Beitrag mit weiteren Details aktualisieren.Dadurch werden alle Probleminformationen an einem Ort gespeichert, um Ihnen und anderen zu helfen. Es ist schlechte Etikette, die Anregungen und Bemühungen anderer zu ignorieren und dann neu zu veröffentlichen. – DRSE

+0

DRSE Es tut mir leid. In der Tat bin ich verzweifelt, ein Projekt einzureichen, aber immer noch die Fehler, die ich weiterhin den Fehler bekomme, warum. – fred

Antwort

1

Einer Ihrer Halterung Dateien in Test/Einrichtung schlechte Formatierung hat. Das Problem scheint nicht mit Ihren Controllern oder Tests zu sein, da es für jeden einzelnen von ihnen passiert. Alle Geräte werden vor jedem einzelnen Test in die Testdatenbank geladen, auch wenn einige nicht für den aktuellen Test verwendet werden. Wenn also in einer dieser Dateien ein Fehler auftritt, wird dieser für jeden Test erhöht.

Nach dem line from the activerecord source, die den Fehler an der Spitze des Stack-Trace wirft Ihnen zur Verfügung gestellt haben, ActiveRecord erwartet jeden Eintrag in Ihrer YAML Befestigungsdatei ein Schlüssel zu sein, die einen Hash verweist.

Jeder Eintrag in einem Fixture sollte eine Modellinstanz darstellen. Der Schlüssel auf oberster Ebene wird als Name verwendet, um auf diese Instanz zu verweisen (bei der Generierung der Fixture-Vorlage für ein neues Modell benennt rails normalerweise die Namen one und two). Hier ist ein Beispiel für ein YAML-Gerät mit einem guten Eintrag und ein paar verschiedenen Arten von schlechten.

# This will produce a hash associated to key :hash_entry. 
# This is the correct type of entry, all others that follow are incorrect for rails fixtures. 
hash_entry: 
    key1: value1 
    key2: value2 

# This will produce the string "not a hash" associated to key :string_entry 
string_entry: not a hash 

# This will produce the array ["also", "not","a","hash"] associated to key :array_entry 
array_entry: 
    - also 
    - not 
    - a 
    - hash 

# This will produce nil associated to key :nil_entry 
nil_entry: 

Sie benötigen Armaturen Dateien in Test/Einrichtung zu prüfen, und suchen Sie nach einem, der die schlechten Formatierung haben, wie oben beschrieben. Hier finden Sie eine Rake-Aufgabe, mit der Sie feststellen können, welche Dateien und Einträge korrigiert werden müssen. Führen Sie zuerst rails g task fixtures check_format aus und fügen Sie diesen Code in die Rake-Datei ein, die unter lib/tasks/fixtures.rake generiert wird.

namespace :fixtures do 
    desc "Looks for bad fixture files" 
    task check_format: :environment do 
    fixtures_dir = Rails.root.join("test", "fixtures") 
    fixture_files = Pathname.glob("#{fixtures_dir}/**/*.yml") 

    fixture_files.each do |file| 
     fixture = YAML.load(IO.read(file)) 

     fixture.each_pair do |name, entry| 
      puts "Bad fixture entry #{name}: #{entry.inspect} in fixture #{file}" unless entry.is_a? Hash 
     end 
    end 
    end 
end 

Dann laufen rails fixtures:check_format und die beanstandeten Dateien und Einträge werden in der Befehlszeile ausgedruckt werden für Sie und richtig zu finden.