9

Ich habe folgende Hilfsmethode:Attribut in Entwicklung gespeichert, aber nicht in der Produktion

def parse_potential_followers(params) 
    t_id = TestSet.where(:test_name => params[:test_set][:test_name]).pluck(:id)[0].to_i 
    screen_names = params[:potential_followers].first[1].split("\n").reject(&:blank?) 
    screen_names.each do |s| 
    potential_follower = PotentialFollower.new(
     :screen_name => s, 
     :test_sets_id => t_id, 
     :status => 'new', 
     :slug => generate_slug([t_id.to_s, s]) 
    ) 
    potential_follower.save 
    end 
end 

Das Problem ist, dass, wenn ich diese Methode aufrufen, die test_sets_id übersprungen wird, wenn Daten in der Tabelle in der Entwicklungsumgebung eingesetzt wird , aber nicht in der Produktionsumgebung. Die drei anderen Attribute sind gut gespeichert.

Alle Attribute sind in der Tabelle potential_followers definiert.

Ich habe auch alle Attribute in der potential_follower_params Methode im potential_followers_controller.rb:

def potential_follower_params 
    params.require(:potential_follower).permit(:screen_name, :test_sets_id, :connections, :status, 
    :slug, :created_at, :updated_at) 
end 

test_sets_id als eine ganze Zahl in der Tabelle definiert ist. Ich habe sogar versucht, den Wert T_ID harcoding:

t_id = 12 

Aber es wäre noch nicht in der Produktion zu arbeiten.

Hier ist, was in den Modellen/potential_follower.rb ist:

class PotentialFollower < ActiveRecord::Base 
    belongs_to :TestSet 
end 

Hier ist das Verfahren in test_sets_contoller.rb:

def create 
    @test_set = TestSet.new(test_set_params) 
    respond_to do |format| 
     if @test_set.save 
      parse_potential_followers(params) 
      format.html { redirect_to @test_set, notice: 'Test set was successfully created.' } 
      format.json { render :show, status: :created, location: @test_set } 
     else 
      format.html { render :new } 
      format.json { render json: @test_set.errors, status: :unprocessable_entity } 
     end 
    end 
end 

Irgendwelche Ideen?

+0

Sie Code für 'PotentialFollower' veröffentlichen können? –

+0

Was meinen Sie Code für PotentialFollower? Contoller? Aussicht? Modell? – EastsideDeveloper

+0

Entschuldigung, dann Model. –

Antwort

1

Wahrscheinlich hat die Produktionsdatenbank nicht das Feld test_sets_id, aber auch im Produktionsmodus erstellt Rails immer noch den Datenbankeintrag, während das Feld test_sets_id des Hash ignoriert wird. A rake db:migrate RAILS_ENV=production sollte das Problem lösen.

+0

Nein, das Feld ist da. Wenn das Feld nicht vorhanden ist, würde ich einen Fehler erhalten. – EastsideDeveloper

+0

Nein, wenn das Feld nicht vorhanden wäre, würden Sie keinen Fehler erhalten. Ich habe es versucht.Nur um sicher zu sein, haben Sie versucht, 'rake db: migrate RAILS_ENV = production' auszuführen? – tillmo

+0

1) Ich habe Ihnen bereits gesagt, dass das Feld in der DB existiert. Ich betreibe phpmyadmin und ich kann alle Felder sehen. 2) ein fehlendes Feld aus der Tabelle wird absolut positiv ein "etwas schief gelaufen", weil keine der Ansichten funktioniert, 3) Ich habe Skript erstellen, das Rake aufruft: db migrieren ... und 4) Ich habe es bereits gesagt du, dass das Feld da ist – EastsideDeveloper

1

Sie weichen von den Rails-Konventionen ab. Das angies_to sollte in snake case und singular sein, dh:

Die Datenbankspalte sollte ebenfalls singular sein. Daher sollte die Spalte in test_set_id umbenannt werden.

Was eine belongs_to :test_set Deklaration tun wird ist, dass es eine test_set_id= (und eine test_set= Methode auch) auf PotentialFollower erzeugt. Das ist die Konvention für Schienen. Sobald Sie Ihre "gehört_zu" geändert haben, sollte der Wert in Entwicklung und Produktion erfolgreich gespeichert werden.

Siehe http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to

+0

Das behebt das Problem nicht. Ich bin vielleicht von den Regeln abgewichen, aber es erklärt nicht, warum Rails es im Entwicklungsmodus richtig macht, aber nicht in der Produktion. – EastsideDeveloper

+0

Hmm, also haben Sie den Code so geändert, dass er Rails Conventions folgt und es immer noch passiert? Das größte AFAIK zwischen Dev und Prod ist, dass prod alle Klassen am Anfang lädt - siehe 'config.cache_classes' –

+0

Ja, aber das bedeutet nur, dass der Code nicht zwischen Requests neu geladen wird, während er im Dev-Modus neu geladen wird. Das sollte das Verhalten des Codes nicht ändern. Ich lösche auch den Cache/Assets und kompiliere Assets in der Produktion vor jeder Produktionsbereitstellung (und Test auf Produktion). Also, es ist jedes Mal ein sauberer Build. – EastsideDeveloper