Fearless Fool
2011-May-05 06:18 UTC
convincing form_for to generate params for parent class
I have an STI class structure: class MeteredService < ActiveRecord::Base ; end class PGEService < MeteredService ; end class SCEService < MeteredService ; end In my view, I want update (say) the :resource field: <%= form_for(metered_service, :url => metered_service_path(metered_service)) do |f| %> <%= f.text_field ''resource'' %> <%= f.submit "update" %> <% end %> But this generates a params[] hash referring to (e.g.) the PGEService subclass rather than the MeteredService parent class: params = { "utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"bAKcTUYbLZyGcMJPyf3zEiyjlB8aQlRv4lqZdiwElhE=", "pge_service"=>{"resource"=>"gas"}, "commit"=>"update", "action"=>"update", "controller"=>"metered_services", "id"=>"54"} While I could put code in my metered_services_controller to recognize the subclass: def update @ms = MeteredService.find(params[:id]) if @ms.update_attributes(params[@ms.class.name.underscore]) ... end ... that doesn''t smell right to me. There must be some Rails-appropriate trick that will let me write the canonical: def update @ms = MeteredService.find(params[:id]) if @ms.update_attributes(params[:metered_service]) ... end Am I right? What''s the trick? -- Posted via http://www.ruby-forum.com/. -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@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
2011-May-05 20:13 UTC
Re: convincing form_for to generate params for parent class
On 5 May 2011, at 07:18, Fearless Fool <lists-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> I have an STI class structure: > > class MeteredService < ActiveRecord::Base ; end > class PGEService < MeteredService ; end > class SCEService < MeteredService ; end > > In my view, I want update (say) the :resource field: > > <%= form_for(metered_service, :url => > metered_service_path(metered_service)) do |f| %> > <%= f.text_field ''resource'' %> > <%= f.submit "update" %> > <% end %> > > But this generates a params[] hash referring to (e.g.) the PGEService > subclass rather than the MeteredService parent class: > > params = { > "utf8"=>"✓", > "_method"=>"put", > "authenticity_token"=>"bAKcTUYbLZyGcMJPyf3zEiyjlB8aQlRv4lqZdiwElhE=", > "pge_service"=>{"resource"=>"gas"}, > "commit"=>"update", > "action"=>"update", > "controller"=>"metered_services", > "id"=>"54"} > > While I could put code in my metered_services_controller to recognize > the subclass: > > def update > @ms = MeteredService.find(params[:id]) > if @ms.update_attributes(params[@ms.class.name.underscore]) > ... > end > > ... that doesn''t smell right to me. There must be some > Rails-appropriate trick that will let me write the canonical: > > def update > @ms = MeteredService.find(params[:id]) > if @ms.update_attributes(params[:metered_service]) > ... > end > > Am I right? What''s the trick? >You might try form_for :metered_service, metered_service, ... I also have vague memories of overwriting model_name in order to get sti classes to behave nicely with a single set of resourceful routes/controllers Fred> -- > Posted via http://www.ruby-forum.com/. > > -- > 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@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. >-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@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.