I am in the process of subclassing some things in a current Rails
project and would like some feedback on how I''m approaching it... what
I
have works but I''m not sure if there is a better way to approach this.
:-)
I am currently subclassing controllers like so:
class LookupsController < ApplicationController
# GET /lookups
def index
end
#-----------------------------------------------------------------
# the rest of these methods are called from subclassed controllers
#-----------------------------------------------------------------
# GET /{controller_name}
# GET /{controller_name}.xml
def index_list
render ''lookups/index'' and return if controller_name ==
''lookups''
eval(''@'' + controller_name + '' = '' +
model_name + ''.find(:all)'')
respond_to do |format|
format.html { render ''lookups/list'' }
format.xml { render :xml => eval(''@'' +
controller_name +
''.to_xml'') }
end
end
# ... and so on ...
end
class StatesController < LookupsController
def index
index_list
end
end
and the shared view template looks like this;
<h1><%= pretty_controller_name %></h1>
<table>
<thead>
<tr>
<td id="col_actions">Actions</td>
<td id="col_name">Name</td>
</tr>
</thead>
<tbody>
<% for item in eval(''@'' + controller_name) %>
<tr class="<%= cycle("even","odd")
%>">
<td>
<span class="itemActions">
<%= link_to(image_tag(''item_delete.gif''),
eval(model_name + ''_path(:id => item)''),
:confirm => ''Are you sure?'',
:method => :delete,
:class => ''image_link'') %>
<%= link_to(image_tag(''item_edit.gif''),
eval(''edit_'' + model_name +
''_path(:id => item)''),
:class => ''image_link'') %>
</span>
</td>
<td class="itemName">
<%= item.name %> <span
class="itemCount">(<%pluralize(item.jobs.count, "job")
%>)</span>
</td>
</tr>
<% end %>
</tbody>
</table>
<br />
<%= submit_tag "Add a " + pretty_model_name, {:type =>
''button'',
:onClick=>"parent.location=''" +
eval(''new_'' + model_name + ''_path'') +
"''" } %>
and a helper like so:
module LookupsHelper
def controller_name
controller.controller_name
end
def model_name
controller.controller_name.singularize
end
def pretty_model_name
model_name.gsub(''_'', '' '').capitalize_all
end
def pretty_controller_name
controller_name.gsub(''_'', ''
'').capitalize_all
end
end
My main question revolves around the liberal use of eval() ... is there
a better way? Am I making this harder than it should be?
Thanks for any feedback...
Cheers,
Tim
--
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-/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
-~----------~----~----~----~------~----~------~--~---
dblack-TKXtfPMJ4Ozk1uMJSBkQmQ@public.gmane.org
2007-Jun-06 14:39 UTC
Re: questions about inheritance in Rails
Hi -- On Wed, 6 Jun 2007, Tim Ferrell wrote:> > > I am in the process of subclassing some things in a current Rails > project and would like some feedback on how I''m approaching it... what I > have works but I''m not sure if there is a better way to approach this. > :-) > > I am currently subclassing controllers like so: > > class LookupsController < ApplicationController > # GET /lookups > def index > end > > #----------------------------------------------------------------- > # the rest of these methods are called from subclassed controllers > #----------------------------------------------------------------- > > # GET /{controller_name} > # GET /{controller_name}.xml > def index_list > render ''lookups/index'' and return if controller_name == ''lookups'' > eval(''@'' + controller_name + '' = '' + model_name + ''.find(:all)'') > respond_to do |format| > format.html { render ''lookups/list'' } > format.xml { render :xml => eval(''@'' + controller_name + > ''.to_xml'') } > end > endThis is all sort of at first glance, so I could well be overlooking some pitfalls, but why don''t you just say @items or something instead of all the eval''ing? Also, instead of model_name, you could have your helper method return a model class. That way, you could do: @items = model.find(:all)> # ... and so on ... > end > > class StatesController < LookupsController > def index > index_list > end > end > > and the shared view template looks like this; > > > <h1><%= pretty_controller_name %></h1> > <table> > <thead> > <tr> > <td id="col_actions">Actions</td> > <td id="col_name">Name</td> > </tr> > </thead> > <tbody> > <% for item in eval(''@'' + controller_name) %> > <tr class="<%= cycle("even","odd") %>"> > <td> > <span class="itemActions"> > > <%= link_to(image_tag(''item_delete.gif''), > eval(model_name + ''_path(:id => item)''),At the very least I would use send there: send("#{model_name}_path", :id => item) But it''s nicer if you can encapsulated that kind of calculation in the controller or a helper method. I''ll leave it at that, pending feedback on what I''ve missed :-) David -- Q. What is THE Ruby book for Rails developers? A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black) (See what readers are saying! http://www.rubypal.com/r4rrevs.pdf) Q. Where can I get Ruby/Rails on-site training, consulting, coaching? A. Ruby Power and Light, LLC (http://www.rubypal.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-/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 -~----------~----~----~----~------~----~------~--~---
David wrote:> > This is all sort of at first glance, so I could well be overlooking > some pitfalls, but why don''t you just say @items or something instead > of all the eval''ing? Also, instead of model_name, you could have your > helper method return a model class. That way, you could do: > > @items = model.find(:all) >Thanks... good point. :-) I was so focused on translating the existing code that I missed that.> > At the very least I would use send there: > > send("#{model_name}_path", :id => item) > > But it''s nicer if you can encapsulated that kind of calculation in the > controller or a helper method. >In other words, wrap the route method invocation with a helper method to simplify the view code? One other question comes to mind... in the view I am creating a button... <%= submit_tag "Add a " + pretty_model_name, {:type => ''button'', :onClick=>"parent.location=''" + eval(''new_'' + model_name + ''_path'') + "''" } %> Is there a cleaner way to do this besides building the onClick javascript?> I''ll leave it at that, pending feedback on what I''ve missed :-)Thanks much for the feedback! Cheers, Tim -- 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-/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 -~----------~----~----~----~------~----~------~--~---
dblack-TKXtfPMJ4Ozk1uMJSBkQmQ@public.gmane.org
2007-Jun-06 14:58 UTC
Re: questions about inheritance in Rails
Hi -- On Wed, 6 Jun 2007, Tim Ferrell wrote:> > David wrote: >> >> This is all sort of at first glance, so I could well be overlooking >> some pitfalls, but why don''t you just say @items or something instead >> of all the eval''ing? Also, instead of model_name, you could have your >> helper method return a model class. That way, you could do: >> >> @items = model.find(:all) >> > > Thanks... good point. :-) I was so focused on translating the existing > code that I missed that. > >> >> At the very least I would use send there: >> >> send("#{model_name}_path", :id => item) >> >> But it''s nicer if you can encapsulated that kind of calculation in the >> controller or a helper method. >> > > In other words, wrap the route method invocation with a helper method to > simplify the view code?Yes -- something like: def model_path(*args) send("#{model_name}_path", *args) end at which point you could do: <%= link to "Click here", model_path :id => item %> There may be yet further ways to simplify it all but initially at least I''d go for pushing all the low-level-ish stuff out of the views and see what happens. (Punting on the JS question... :-) David -- Q. What is THE Ruby book for Rails developers? A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black) (See what readers are saying! http://www.rubypal.com/r4rrevs.pdf) Q. Where can I get Ruby/Rails on-site training, consulting, coaching? A. Ruby Power and Light, LLC (http://www.rubypal.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-/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 -~----------~----~----~----~------~----~------~--~---