9

Ho la seguente metodo di supporto:Attributo salvato in fase di sviluppo, ma non in produzione

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 

Il problema è che quando chiamo questo metodo, il test_sets_id viene saltato quando si inserisce i dati nella tabella nell'ambiente di sviluppo , ma non nell'ambiente di produzione. Gli altri tre attributi vengono salvati correttamente.

Tutti gli attributi sono definiti nella tabella potential_followers.

devo anche tutti gli attributi nel metodo potential_follower_params nella 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 è definito come un numero intero nella tabella. Ho persino provato a codificare il valore di t_id:

t_id = 12 

Ma non funzionerebbe ancora in produzione.

Ecco cosa c'è nella modelli/potential_follower.rb:

class PotentialFollower < ActiveRecord::Base 
    belongs_to :TestSet 
end 

Ecco il metodo 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 

Tutte le idee?

+0

Puoi pubblicare il codice per 'PotentialFollower'? –

+0

Cosa intendi per codice per PotentialFollower? Conttoller? Vista? Modello? – EastsideDeveloper

+0

Scusa, quindi Modello. –

risposta

1

Probabilmente il database di produzione non ha il campo test_sets_id, ma anche in modalità produzione, i binari creano ancora il record del database, ignorando il campo test_sets_id dell'hash. Un rake db:migrate RAILS_ENV=production dovrebbe risolvere il problema.

+0

No, il campo è lì. Inoltre, se il campo non è lì, ricevo un errore. – EastsideDeveloper

+0

No, se il campo non fosse lì, non si otterrebbe un errore. L'ho provatoPer sicurezza, hai provato a eseguire 'rake db: migrate RAILS_ENV = production'? – tillmo

+0

1) Ti ho già detto che il campo esiste nel DB. Corro phpmyadmin e posso vedere tutti i campi. 2) un campo mancante dal tavolo produrrà assolutamente "qualcosa è andato storto" perché nessuna delle viste funzionerà, 3) ho uno script di build che chiama rake: db migrate ... e 4) l'ho già detto tu che il campo è lì – EastsideDeveloper

1

Ti stai allontanando dalle convenzioni di Rails. Il appartiene_to dovrebbe essere in caso di serpente e singolare, vale a dire:

belongs_to :test_set 

La colonna del database dovrebbe essere anche singolare. Quindi la colonna dovrebbe essere rinominata in test_set_id.

Ciò che una dichiarazione belongs_to :test_set farà è che genererà un test_set_id= (e anche un metodo test_set=) su PotentialFollower. Questa è la convenzione per Rails. Una volta che hai cambiato il tuo appartiene a, dovrebbe ora salvare con successo il valore nello sviluppo e nella produzione.

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

+0

Questo non ha risolto il problema. Potrei essermi allontanato dalle regole, ma non spiega perché Rails lo sta facendo correttamente in modalità sviluppo ma non in produzione. – EastsideDeveloper

+0

Hmm, quindi hai corretto il codice per seguire le convenzioni Rails e sta ancora accadendo? Il più grande AFAIK tra dev e prod è che prod carica tutte le classi all'inizio - vedi 'config.cache_classes' –

+0

Sì, ma ciò significa semplicemente che il codice non viene ricaricato tra le richieste mentre in modalità dev è ricaricato. Questo non dovrebbe cambiare il comportamento del codice. Inoltre, ho eliminato la cache/risorse e ricompilando le risorse sulla produzione prima di ogni distribuzione di produzione (e test sulla produzione). Quindi, è una build pulita ogni volta. – EastsideDeveloper

Problemi correlati