Troy
2008-Oct-21 17:21 UTC
Different behavior between production and development environments?
I have a yaml file that I am trying to import. If I am in the
development environment it works perfectly, but when I am in the
production environment it fails.
The line "records = YAML::load( params[:importfile] )" is where things
get weird.
production environment gets this "#<Contract sdc_ref:
"ST-20080515",
description: "8x..."
development environment gets this "#<YAML::Object:0xb6373744
@ivars={"attributes"=>{"discount_ce_day"=>0..."
So
"contract_ary.ivars[''attributes''].update(options)"
works in the
development environment but fails in the production environment.
Can anyone please tell me why this is happening?
Ubuntu 8.04
ruby 1.8.6
rails 2.1.1
Thanks
##import_controller.rb
def create()
debugger
records = YAML::load( params[:importfile] ) #<< Problem occurs
here
#Separate out the data
contract_ary = records[0]
line_items_ary = records[1..-1]
aryAcct = params[:account_id].split(''|'')
arySales = params[:sales_office].split(''|'')
arySupport = params[:support_office].split(''|'')
options = {''account_id'' => aryAcct[0],
''account_name'' =>
aryAcct[1], ''sales_rep_id'' => params[:sales_rep_id],
''sales_office'' =>
arySales[0], ''sales_office_name'' => arySales[1],
''support_office'' =>
arySupport[0], ''support_office_name'' => arySupport[1],
''platform'' =>
params[:platform], ''contract_type'' =>
params[:contract_type]}
contract_ary.ivars[''attributes''].update(options)
#Cleanup
records = nil
#Save new contract
if params[:contract] != ""
@contract = Contract.find(params[:contract])
@contract.hw_support_level_id =
contract_ary.ivars[''attributes'']
[''hw_support_level_id'']
@contract.sw_support_level_id =
contract_ary.ivars[''attributes'']
[''sw_support_level_id'']
@contract.updates =
contract_ary.ivars[''attributes''][''updates'']
@contract.said =
contract_ary.ivars[''attributes''][''said'']
else
@contract =
Contract.new(contract_ary.ivars[''attributes''])
end
#if Contract successfully saves then import
#associated line items
if @contract.save
line_items_ary.each do |item|
@line_item
@contract.line_items.new(item.ivars[''attributes''])
@line_item.save
end
end
respond_to do |format|
if !@contract.new_record?
flash[:notice] = ''Contract was successfully created.''
format.html { redirect_to(@contract) }
format.xml { render :xml => @contract, :status
=> :created, :location => @contract }
else
flash[:notice] = ''Contract was not successfully
created.''
format.html { render :action => "new" }
format.xml { render :xml => @contract.errors, :status
=> :unprocessable_entity }
end
end
end
## YAML file to import
- !ruby/object:Contract
attributes:
sdc_ref: ST-20080515
said: ABC Co.
description: 8x rp34xx, 2x rx2620, rx3600, EVA8K
cust_po_num: 243422
payment_terms: Quarterly
revenue: 108933.323333333
annual_hw_rev: 73904.9294117647
annual_sw_rev: 2989.18117647059
annual_ce_rev: 0
annual_sa_rev: 0
annual_dr_rev: 0
start_date: 8/1/2008
end_date: 12/31/2009
multiyr_end: 8/1/2009
hw_support_level_id: SDC 24x7
sw_support_level_id: SDC SW 24x7
updates: Yes
ce_days: 0
sa_days: 0
discount_pref_hw: 0.3
discount_pref_sw: 0.3
discount_pref_srv: 0
discount_prepay: 0.05
discount_multiyear: 0
discount_ce_day: 0
discount_sa_day: 0
- !ruby/object:LineItem
attributes:
support_type: HW
product_num: LABEL
serial_num:
description: HPORAPPQ
begins: 12:00:00 AM
ends: 12:00:00 AM
qty:
list_price:
position: 1
support_provider: XYZ
- !ruby/object:LineItem
attributes:
support_type: HW
product_num: A9953A
serial_num: USL530SKTB
description: rp3440 PA8900 1GHz 1 Way Server
begins: 2/1/2009
ends: 12/31/2009
qty: 1
list_price: 105
position: 2
support_provider: XYZ
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Troy
2008-Oct-22 11:53 UTC
Re: Different behavior between production and development environments?
Even more specifically, it happens when config.cache_classes = true. Other caching has no effect. Is there a way to turn class caching off for just this one class/action? Thanks On Oct 21, 12:21 pm, Troy <tbn...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> I have ayamlfile that I am trying to import. If I am in the > development environment it works perfectly, but when I am in the > production environment it fails. > > The line "records =YAML::load( params[:importfile] )" is where things > get weird. > > production environment gets this "#<Contract sdc_ref: "ST-20080515", > description: "8x..." > > development environment gets this "#<YAML::Object:0xb6373744 > @ivars={"attributes"=>{"discount_ce_day"=>0..." > > So "contract_ary.ivars[''attributes''].update(options)" works in the > development environment but fails in the production environment. > > Can anyone please tell me why this is happening? > > Ubuntu 8.04 > ruby 1.8.6 > rails 2.1.1 > > Thanks > > ##import_controller.rb > def create() > debugger > records =YAML::load( params[:importfile] ) #<< Problem occurs > here > #Separate out the data > > contract_ary = records[0] > line_items_ary = records[1..-1] > aryAcct = params[:account_id].split(''|'') > arySales = params[:sales_office].split(''|'') > arySupport = params[:support_office].split(''|'') > options = {''account_id'' => aryAcct[0], ''account_name'' => > aryAcct[1], ''sales_rep_id'' => params[:sales_rep_id], ''sales_office'' => > arySales[0], ''sales_office_name'' => arySales[1], ''support_office'' => > arySupport[0], ''support_office_name'' => arySupport[1], ''platform'' => > params[:platform], ''contract_type'' => params[:contract_type]} > contract_ary.ivars[''attributes''].update(options) > > #Cleanup > records = nil > > #Save new contract > if params[:contract] != "" > @contract = Contract.find(params[:contract]) > @contract.hw_support_level_id = contract_ary.ivars[''attributes''] > [''hw_support_level_id''] > @contract.sw_support_level_id = contract_ary.ivars[''attributes''] > [''sw_support_level_id''] > @contract.updates = contract_ary.ivars[''attributes''][''updates''] > @contract.said = contract_ary.ivars[''attributes''][''said''] > else > @contract = Contract.new(contract_ary.ivars[''attributes'']) > end > > #if Contract successfully saves then import > #associated line items > if @contract.save > line_items_ary.each do |item| > @line_item > @contract.line_items.new(item.ivars[''attributes'']) > @line_item.save > end > end > > respond_to do |format| > if !...@contract.new_record? > flash[:notice] = ''Contract was successfully created.'' > format.html { redirect_to(@contract) } > format.xml { render :xml => @contract, :status > => :created, :location => @contract } > else > flash[:notice] = ''Contract was not successfully created.'' > format.html { render :action => "new" } > format.xml { render :xml => @contract.errors, :status > => :unprocessable_entity } > end > end > end > > ##YAMLfile to import > - !ruby/object:Contract > attributes: > sdc_ref: ST-20080515 > said: ABC Co. > description: 8x rp34xx, 2x rx2620, rx3600, EVA8K > cust_po_num: 243422 > payment_terms: Quarterly > revenue: 108933.323333333 > annual_hw_rev: 73904.9294117647 > annual_sw_rev: 2989.18117647059 > annual_ce_rev: 0 > annual_sa_rev: 0 > annual_dr_rev: 0 > start_date: 8/1/2008 > end_date: 12/31/2009 > multiyr_end: 8/1/2009 > hw_support_level_id: SDC 24x7 > sw_support_level_id: SDC SW 24x7 > updates: Yes > ce_days: 0 > sa_days: 0 > discount_pref_hw: 0.3 > discount_pref_sw: 0.3 > discount_pref_srv: 0 > discount_prepay: 0.05 > discount_multiyear: 0 > discount_ce_day: 0 > discount_sa_day: 0 > - !ruby/object:LineItem > attributes: > support_type: HW > product_num: LABEL > serial_num: > description: HPORAPPQ > begins: 12:00:00 AM > ends: 12:00:00 AM > qty: > list_price: > position: 1 > support_provider: XYZ > - !ruby/object:LineItem > attributes: > support_type: HW > product_num: A9953A > serial_num: USL530SKTB > description: rp3440 PA8900 1GHz 1 Way Server > begins: 2/1/2009 > ends: 12/31/2009 > qty: 1 > list_price: 105 > position: 2 > support_provider: XYZ--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Frederick Cheung
2008-Oct-23 02:23 UTC
Re: Different behavior between production and development environments?
On 22 Oct 2008, at 07:53, Troy wrote:> > Even more specifically, it happens when config.cache_classes = true. > Other caching has no effect. Is there a way to turn class caching off > for just this one class/action? >Your YAML file contains serialized ruby objects - the !ruby/ object:LineItem bits indicate that. In dev mode, constants are removed after requests (this is part of the reloading of source in dev mode, which is exactly what config.cache_classes does). Odds are that when you hit your create action the LineItem and Contract classes have not yet been loaded. YAML''s loading does not apparently hit const_missing so when it sees a constant (ie Contract) that does not exist you just get something generic (ie YAML::Object). In production mode classes are never cleared out like this so unless the server is serving its very first request odds are the Contract class is loaded so you get back an instance of Contract. YAML::Object has an ivars method that gets you something like a hash of instance variables, but other objects don''t (everyone has instance_variable_get though, but that''s not very nice) It is the dev mode behavious which is weird, you can work around it by using require_dependency to load contract, line_item and whatever else you need. Personally I wouldn''t store the active record objects themselves - just their hash of attributes. Fred> Thanks > > On Oct 21, 12:21 pm, Troy <tbn...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >> I have ayamlfile that I am trying to import. If I am in the >> development environment it works perfectly, but when I am in the >> production environment it fails. >> >> The line "records =YAML::load( params[:importfile] )" is where things >> get weird. >> >> production environment gets this "#<Contract sdc_ref: "ST-20080515", >> description: "8x..." >> >> development environment gets this "#<YAML::Object:0xb6373744 >> @ivars={"attributes"=>{"discount_ce_day"=>0..." >> >> So "contract_ary.ivars[''attributes''].update(options)" works in the >> development environment but fails in the production environment. >> >> Can anyone please tell me why this is happening? >> >> Ubuntu 8.04 >> ruby 1.8.6 >> rails 2.1.1 >> >> Thanks >> >> ##import_controller.rb >> def create() >> debugger >> records =YAML::load( params[:importfile] ) #<< Problem occurs >> here >> #Separate out the data >> >> contract_ary = records[0] >> line_items_ary = records[1..-1] >> aryAcct = params[:account_id].split(''|'') >> arySales = params[:sales_office].split(''|'') >> arySupport = params[:support_office].split(''|'') >> options = {''account_id'' => aryAcct[0], ''account_name'' => >> aryAcct[1], ''sales_rep_id'' => params[:sales_rep_id], ''sales_office'' >> => >> arySales[0], ''sales_office_name'' => arySales[1], ''support_office'' => >> arySupport[0], ''support_office_name'' => arySupport[1], ''platform'' => >> params[:platform], ''contract_type'' => params[:contract_type]} >> contract_ary.ivars[''attributes''].update(options) >> >> #Cleanup >> records = nil >> >> #Save new contract >> if params[:contract] != "" >> @contract = Contract.find(params[:contract]) >> @contract.hw_support_level_id = >> contract_ary.ivars[''attributes''] >> [''hw_support_level_id''] >> @contract.sw_support_level_id = >> contract_ary.ivars[''attributes''] >> [''sw_support_level_id''] >> @contract.updates = contract_ary.ivars[''attributes''][''updates''] >> @contract.said = contract_ary.ivars[''attributes''][''said''] >> else >> @contract = Contract.new(contract_ary.ivars[''attributes'']) >> end >> >> #if Contract successfully saves then import >> #associated line items >> if @contract.save >> line_items_ary.each do |item| >> @line_item >> @contract.line_items.new(item.ivars[''attributes'']) >> @line_item.save >> end >> end >> >> respond_to do |format| >> if !...@contract.new_record? >> flash[:notice] = ''Contract was successfully created.'' >> format.html { redirect_to(@contract) } >> format.xml { render :xml => @contract, :status >> => :created, :location => @contract } >> else >> flash[:notice] = ''Contract was not successfully created.'' >> format.html { render :action => "new" } >> format.xml { render :xml => @contract.errors, :status >> => :unprocessable_entity } >> end >> end >> end >> >> ##YAMLfile to import >> - !ruby/object:Contract >> attributes: >> sdc_ref: ST-20080515 >> said: ABC Co. >> description: 8x rp34xx, 2x rx2620, rx3600, EVA8K >> cust_po_num: 243422 >> payment_terms: Quarterly >> revenue: 108933.323333333 >> annual_hw_rev: 73904.9294117647 >> annual_sw_rev: 2989.18117647059 >> annual_ce_rev: 0 >> annual_sa_rev: 0 >> annual_dr_rev: 0 >> start_date: 8/1/2008 >> end_date: 12/31/2009 >> multiyr_end: 8/1/2009 >> hw_support_level_id: SDC 24x7 >> sw_support_level_id: SDC SW 24x7 >> updates: Yes >> ce_days: 0 >> sa_days: 0 >> discount_pref_hw: 0.3 >> discount_pref_sw: 0.3 >> discount_pref_srv: 0 >> discount_prepay: 0.05 >> discount_multiyear: 0 >> discount_ce_day: 0 >> discount_sa_day: 0 >> - !ruby/object:LineItem >> attributes: >> support_type: HW >> product_num: LABEL >> serial_num: >> description: HPORAPPQ >> begins: 12:00:00 AM >> ends: 12:00:00 AM >> qty: >> list_price: >> position: 1 >> support_provider: XYZ >> - !ruby/object:LineItem >> attributes: >> support_type: HW >> product_num: A9953A >> serial_num: USL530SKTB >> description: rp3440 PA8900 1GHz 1 Way Server >> begins: 2/1/2009 >> ends: 12/31/2009 >> qty: 1 >> list_price: 105 >> position: 2 >> support_provider: XYZ > >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Troy
2008-Oct-24 03:20 UTC
Re: Different behavior between production and development environments?
Thanks Fred, that makes perfect sense now. Now I can turn the cache_classes back on. On Oct 22, 9:23 pm, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On 22 Oct 2008, at 07:53,Troywrote: > > > > > Even more specifically, it happens when config.cache_classes = true. > > Other caching has no effect. Is there a way to turn class caching off > > for just this one class/action? > > Your YAML file contains serialized ruby objects - the !ruby/ > object:LineItem bits indicate that. > In dev mode, constants are removed after requests (this is part of the > reloading of source in dev mode, which is exactly what > config.cache_classes does). > Odds are that when you hit your create action the LineItem and > Contract classes have not yet been loaded. YAML''s loading does not > apparently hit const_missing so when it sees a constant (ie Contract) > that does not exist you just get something generic (ie YAML::Object). > In production mode classes are never cleared out like this so unless > the server is serving its very first request odds are the Contract > class is loaded so you get back an instance of Contract. YAML::Object > has an ivars method that gets you something like a hash of instance > variables, but other objects don''t (everyone has instance_variable_get > though, but that''s not very nice) > > It is the dev mode behavious which is weird, you can work around it by > using require_dependency to load contract, line_item and whatever else > you need. Personally I wouldn''t store the active record objects > themselves - just their hash of attributes. > > Fred > > > Thanks > > > On Oct 21, 12:21 pm,Troy<tbn...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > >> I have ayamlfile that I am trying to import. If I am in the > >> development environment it works perfectly, but when I am in the > >> production environment it fails. > > >> The line "records =YAML::load( params[:importfile] )" is where things > >> get weird. > > >> production environment gets this "#<Contract sdc_ref: "ST-20080515", > >> description: "8x..." > > >> development environment gets this "#<YAML::Object:0xb6373744 > >> @ivars={"attributes"=>{"discount_ce_day"=>0..." > > >> So "contract_ary.ivars[''attributes''].update(options)" works in the > >> development environment but fails in the production environment. > > >> Can anyone please tell me why this is happening? > > >> Ubuntu 8.04 > >> ruby 1.8.6 > >> rails 2.1.1 > > >> Thanks > > >> ##import_controller.rb > >> def create() > >> debugger > >> records =YAML::load( params[:importfile] ) #<< Problem occurs > >> here > >> #Separate out the data > > >> contract_ary = records[0] > >> line_items_ary = records[1..-1] > >> aryAcct = params[:account_id].split(''|'') > >> arySales = params[:sales_office].split(''|'') > >> arySupport = params[:support_office].split(''|'') > >> options = {''account_id'' => aryAcct[0], ''account_name'' => > >> aryAcct[1], ''sales_rep_id'' => params[:sales_rep_id], ''sales_office'' > >> => > >> arySales[0], ''sales_office_name'' => arySales[1], ''support_office'' => > >> arySupport[0], ''support_office_name'' => arySupport[1], ''platform'' => > >> params[:platform], ''contract_type'' => params[:contract_type]} > >> contract_ary.ivars[''attributes''].update(options) > > >> #Cleanup > >> records = nil > > >> #Save new contract > >> if params[:contract] != "" > >> @contract = Contract.find(params[:contract]) > >> @contract.hw_support_level_id = > >> contract_ary.ivars[''attributes''] > >> [''hw_support_level_id''] > >> @contract.sw_support_level_id = > >> contract_ary.ivars[''attributes''] > >> [''sw_support_level_id''] > >> @contract.updates = contract_ary.ivars[''attributes''][''updates''] > >> @contract.said = contract_ary.ivars[''attributes''][''said''] > >> else > >> @contract = Contract.new(contract_ary.ivars[''attributes'']) > >> end > > >> #if Contract successfully saves then import > >> #associated line items > >> if @contract.save > >> line_items_ary.each do |item| > >> @line_item > >> @contract.line_items.new(item.ivars[''attributes'']) > >> @line_item.save > >> end > >> end > > >> respond_to do |format| > >> if !...@contract.new_record? > >> flash[:notice] = ''Contract was successfully created.'' > >> format.html { redirect_to(@contract) } > >> format.xml { render :xml => @contract, :status > >> => :created, :location => @contract } > >> else > >> flash[:notice] = ''Contract was not successfully created.'' > >> format.html { render :action => "new" } > >> format.xml { render :xml => @contract.errors, :status > >> => :unprocessable_entity } > >> end > >> end > >> end > > >> ##YAMLfile to import > >> - !ruby/object:Contract > >> attributes: > >> sdc_ref: ST-20080515 > >> said: ABC Co. > >> description: 8x rp34xx, 2x rx2620, rx3600, EVA8K > >> cust_po_num: 243422 > >> payment_terms: Quarterly > >> revenue: 108933.323333333 > >> annual_hw_rev: 73904.9294117647 > >> annual_sw_rev: 2989.18117647059 > >> annual_ce_rev: 0 > >> annual_sa_rev: 0 > >> annual_dr_rev: 0 > >> start_date: 8/1/2008 > >> end_date: 12/31/2009 > >> multiyr_end: 8/1/2009 > >> hw_support_level_id: SDC 24x7 > >> sw_support_level_id: SDC SW 24x7 > >> updates: Yes > >> ce_days: 0 > >> sa_days: 0 > >> discount_pref_hw: 0.3 > >> discount_pref_sw: 0.3 > >> discount_pref_srv: 0 > >> discount_prepay: 0.05 > >> discount_multiyear: 0 > >> discount_ce_day: 0 > >> discount_sa_day: 0 > >> - !ruby/object:LineItem > >> attributes: > >> support_type: HW > >> product_num: LABEL > >> serial_num: > >> description: HPORAPPQ > >> begins: 12:00:00 AM > >> ends: 12:00:00 AM > >> qty: > >> list_price: > >> position: 1 > >> support_provider: XYZ > >> - !ruby/object:LineItem > >> attributes: > >> support_type: HW > >> product_num: A9953A > >> serial_num: USL530SKTB > >> description: rp3440 PA8900 1GHz 1 Way Server > >> begins: 2/1/2009 > >> ends: 12/31/2009 > >> qty: 1 > >> list_price: 105 > >> position: 2 > >> support_provider: XYZ--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---