11155
(-- --)
1
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?
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