9

Mam następujące metody pomocnika:Atrybut zapisane w rozwoju, ale nie w produkcji

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 

Problemem jest to, że gdy zgłoszę tej metody, test_sets_id jest pomijany, gdy dane są umieszczone w tabeli w środowisku programistycznym , ale nie w środowisku produkcyjnym. Trzy pozostałe atrybuty są zapisane w porządku.

Wszystkie atrybuty są zdefiniowane w tabeli potencjalnych_aplikatorów.

również wszystkie atrybuty w metodzie potential_follower_params w 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 jest definiowany jako liczba całkowita w tabeli. Próbowałem nawet przekodować wartość atrybutu t_id:

t_id = 12 

Ale nadal nie działałby przy produkcji.

Oto co jest w models/potential_follower.rb:

class PotentialFollower < ActiveRecord::Base 
    belongs_to :TestSet 
end 

Oto metoda 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 

Jakieś pomysły?

+0

Czy możesz napisać kod dla 'PotentialFollower'? –

+0

Co to znaczy kod dla PotentialFollower? Conttoller? Widok? Model? – EastsideDeveloper

+0

Przepraszam, potem Model. –

Odpowiedz

1

Prawdopodobnie produkcyjna baza danych nie ma pola test_sets_id, ale także w trybie produkcji, szyny wciąż tworzą rekord bazy danych, a po prostu ignorują pole mieszania test_sets_id. A rake db:migrate RAILS_ENV=production powinien rozwiązać problem.

+0

Nie, pole tam jest. Ponadto, jeśli pole nie jest tam, dostanę błąd. – EastsideDeveloper

+0

Nie, jeśli pola tam nie było, nie można uzyskać błędu. Próbowałem tego.Aby upewnić się, czy próbowałeś wykonać 'rake db: migrate RAILS_ENV = production'? – tillmo

+0

1) Powiedziałem już, że pole istnieje w DB. Uruchomę phpmyadmin i widzę wszystkie pola. 2) brakujące pole z tabeli absolutnie, pozytywnie wytworzy "coś poszło nie tak", ponieważ żaden widok nie zadziała, 3) Mam skrypt budujący, który wywołuje rake: db migracja ... i 4) już powiedziałem że tam jest pole – EastsideDeveloper

1

Odchodzisz od konwencji Railsowych. Element belongs_to powinien znajdować się w jednostce węża i liczbie pojedynczej, tj .:

belongs_to :test_set 

Kolumna bazy danych również powinna być w liczbie pojedynczej. Dlatego też należy zmienić nazwę kolumny na test_set_id.

Co zrobi deklaracja belongs_to :test_set to, że wygeneruje ona również metodę test_set_id= (i test_set=) w produkcie PotentialFollower. Taka jest konwencja dla Rails. Po zmianie strony belongs_to powinna ona teraz pomyślnie zapisać wartość w rozwoju i produkcji.

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

+0

To nie rozwiązało problemu. Mogłem odstąpić od zasad, ale to nie wyjaśnia, dlaczego Rails robi to poprawnie w trybie programowania, ale nie w produkcji. – EastsideDeveloper

+0

Hmm, więc naprawiłeś kod podążający za konwencjami Railsów i tak się dzieje? Największym AFAIK między dev i prod jest to, że prod wczytuje wszystkie klasy na początku - patrz 'config.cache_classes' –

+0

Tak, ale to tylko oznacza, że ​​kod nie jest ładowany pomiędzy żądaniami, podczas gdy w trybie deweloperskim jest przeładowywany. To nie powinno zmieniać zachowania kodu. Usuwam również pamięć podręczną/zasoby i rekompiluję zasoby produkcyjne przed każdym wdrożeniem produkcyjnym (i testem na produkcji). Więc za każdym razem jest to czysta kompilacja. – EastsideDeveloper