Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Attribute saved in development but not in production

I have the following helper method:

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

The problem is that when I call this method, the test_sets_id is skipped when data is inserted in the table in the development environment, but not in the production environment. The three other attributes are saved fine.

All the attributes are defined in the potential_followers table.

I also have all the attributes in the potential_follower_params method in the 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 is defined as an integer in the table. I even tried harcoding the value of t_id:

t_id = 12

But it still would not work in production.

Here's what's in the models/potential_follower.rb:

class PotentialFollower < ActiveRecord::Base
  belongs_to :TestSet
end

Here's the method 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

Any ideas?

like image 890
EastsideDev Avatar asked Jan 04 '16 11:01

EastsideDev


2 Answers

Probably the production database does not have the field test_sets_id, but also in production mode, rails still creates the database record, while just ignoring the test_sets_id field of the hash. A rake db:migrate RAILS_ENV=production should solve the issue.

like image 153
tillmo Avatar answered Oct 06 '22 22:10

tillmo


You are straying from the Rails conventions. The belongs_to should be in snake case and singular, ie :

belongs_to :test_set

The database column should be singular as well. So the column should be renamed to test_set_id.

What a belongs_to :test_set declaration will do is that it will generate a test_set_id= (and a test_set= method too) on PotentialFollower. That is the convention for Rails. Once you have changed your belongs_to, it should now successfully save the value in development and production.

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

like image 35
Thong Kuah Avatar answered Oct 06 '22 20:10

Thong Kuah