I have a model that looks like this (with various other methods) class HsdPair attr_accessor :hsd def initialize(hsd) @hsd = hsd @current_display = 0 @has_changed_flag = false end end After initializing this object in the controller @hsd_pairs = HsdPair.new(@job.hsd_pairs) using it in the view various times and in various ways, when I try to pass this object back to the controller for various ajax interactions like so: <%= link_to_remote image_tag("right-arrow.png", :size => "48x48"), :url => { :action => "hsd_forward", :hsd_pairs => hsd_pairs }, :with => "''update=''+$(''current_display'').value" %> it shows up as being passed as a string: Parameters: {"authenticity_token"=>"UGj1tJruzDdzBGexIZCLyYluQINn2Wl9pADFQ7G1SY4=", "hsd_pairs"=>"#<HsdPair:0xb1c4fc14>", "update"=>"0"} Any idea on how to solve this or to get the data back from that pointer? Thanks. Alternatively, does anyone know if PassiveRecord solves this problem? -- Posted via http://www.ruby-forum.com/.
Luke van der Hoeven wrote:> > Any idea on how to solve this or to get the data back from that pointer? > Thanks. > > Alternatively, does anyone know if PassiveRecord solves this problem?First of all, it''s not a pointer.. Secondly, the object is being passed from a web client most probably on another host back to your web server.. how could it be resolved by de-referencing a pointer? NOT TESTED.. just ideas to get you started.. If you make your initialize method look like this: class HsdPair def initialize(hsd) if(hsd.kind_of? Map) @current_display = hsd[:current_display] || 0 @has_changed_flag = hsd[:has_changed_flag] || false @hsd = hsd[:hsd] || raise "hsd attribute missing" else @current_display = 0 @has_changed_flag = false @hsd = hsd end end # Much more elegant ways to do this but not sure if you are on 1.8 or 1.9 def to_params() {:current_display => @current_display, :has_changed_flag => @has_changed_flag, :hsd => @hsd} end end Then you can reconstruct the object on the server side by calling HsdPair.new(params) hth ilan -- Posted via http://www.ruby-forum.com/.
When ERB compiles your view, the result is a string. If I remember correctly, the to_s method is invoked on objects, which in this case results in the string that you are seeing. You need to pass in an identifier that can be used to look up the specific instance of HsdPair, or alternatively, use a low cost db like sqlite and pass in the id. On Sep 24, 1:42 pm, Luke Lukas <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> I have a model that looks like this (with various other methods) > > class HsdPair > attr_accessor :hsd > > def initialize(hsd) > @hsd = hsd > @current_display = 0 > @has_changed_flag = false > end > end > > After initializing this object in the controller > > @hsd_pairs = HsdPair.new(@job.hsd_pairs) > > using it in the view various times and in various ways, when I try to > pass this object back to the controller for various ajax interactions > like so: > <%= link_to_remote image_tag("right-arrow.png", :size => "48x48"), > :url => { > :action => "hsd_forward", > :hsd_pairs => hsd_pairs }, > :with => "''update=''+$(''current_display'').value" %> > > it shows up as being passed as a string: > > Parameters: > {"authenticity_token"=>"UGj1tJruzDdzBGexIZCLyYluQINn2Wl9pADFQ7G1SY4=", > "hsd_pairs"=>"#<HsdPair:0xb1c4fc14>", "update"=>"0"} > > Any idea on how to solve this or to get the data back from that pointer? > Thanks. > > Alternatively, does anyone know if PassiveRecord solves this problem? > -- > Posted viahttp://www.ruby-forum.com/.
Luke van der Hoeven
2009-Sep-24 20:58 UTC
Re: Non-ActiveRecord based model being passed as string?
Ilan Berci wrote:> # Much more elegant ways to do this but not sure if you are on 1.8 or > 1.9 > def to_params() > {:current_display => @current_display, :has_changed_flag => > @has_changed_flag, :hsd => @hsd} > end > end > > Then you can reconstruct the object on the server side by calling > HsdPair.new(params)what does the constructor method do differently in 1.8 vs. 1.9? Does it exist in 1.8 or 1.9? Currently working with 1.8.x so I''m not sure my constructors will be able to do it without that extra code. Long story short, this method worked. Didn''t figure it''d be as hard as all that, but I suppose without pulling from the db with ActiveRecord, persistence has to be manufactured. Thanks for the help. -- Posted via http://www.ruby-forum.com/.
Luke van der Hoeven wrote:> what does the constructor method do differently in 1.8 vs. 1.9? Does it > exist in 1.8 or 1.9? Currently working with 1.8.x so I''m not sure my > constructors will be able to do it without that extra code. >It wasnt'' the initialize() method that I didn''t like, it was the to_params() non-dry hack which made me feel a little ill.. The method I provided is not maintainable as adding attributes to the class will break the ''serialization'' mechanism.. a much better solution would be to use reflection to run through your attributes and map them (which is slightly different in 1.9 as compared to 1.8) ilan -- Posted via http://www.ruby-forum.com/.
Luke van der Hoeven
2009-Sep-25 13:55 UTC
Re: Non-ActiveRecord based model being passed as string?
Ilan Berci wrote:> The method I provided is not maintainable as adding attributes to the > class will break the ''serialization'' mechanism.. a much better solution > would be to use reflection to run through your attributes and map them > (which is slightly different in 1.9 as compared to 1.8) > > ilanHow would this be done, in a very basic way, when this table is not backed by ActiveRecord? The reflection class is provided by ActiveRecord and this is a table-less data structure right now. Hence the weird need to pass stuff around. I would put it in the db, but this is data being pulled from a database and remapped in a way, as we''re using a non-rails mapped oracle db. My app has to tie into existing data, so its a bit of a problem. Thanks for all the help so far. -- Posted via http://www.ruby-forum.com/.