Wednesday, April 9, 2008

ActiveScaffold - Helpers for columns with same name overwrite each other - FIX

Really quick one today. I was working on my ActiveScaffold project, and came across the following problem:
My Events table has a column called schools, and so does my Schools table. For the Events, I needed a dropdown box listing all schools...while for Schools, I needed a text box to show up to type in the name of the school. Since textboxes are the default for activescaffold, I shouldn't need to do anything with schools in it, however, when I wrote a form override for Events in event_helper.rb to give it a dropdown box...the dropdown showed up in Schools also. So first, I tried doing a form override in the school_helper.rb. No luck, the event helper method has the same name, and overrides whatever method I put in school with the same name. So to fix it, I removed my helper methods from the event and school helpers. In application_helper.rb, I made a function with the same name as the form override function I had been trying to use, and then used an if to determine which model the helper was being called from. Here is the code:


# Methods added to this helper will be available to all templates in the application.
module ApplicationHelper

#hack to make activescaffold form overrides work when 2 models have a field that is the same name
def school_form_column(record, input_name)
if record.class.name == "Event"
select_tag input_name, options_for_select(aschools, selected = record.school)
else #record.class.name =="School"
text_field :record, :school, :name => input_name
end
end

private
#used in case of Event
def aschools
@schools = School.find(:all, :order => 'school')
@schooloptions = Hash.new
for school in @schools
@schooloptions[school.school] = school.abbrv
end
@schooloptions = @schooloptions.sort.each { |e| puts "#{e[0]} => #{e[1]}" }

end

end



Me: 2
ActiveScaffold: 0

Done.

5 comments:

icmgr said...

An easier fix is to comment out the following line from application.rb like this:
#helper: all

G. Sobrinho said...

I have the same problem.

But, my application have 18 entities and i cant use the "if fix".

I tryed to comment the line (commented by icmgr) but doesnt fixed.

Have another solution?

Tks

rledge21 said...

g. sobrinho: I would recommend a switch case statement

G. Sobrinho said...

rledge21, it this a bug of Rails?

rledge21 said...

No, its a bug of ActiveScaffold. From what I have seen, a lot of experienced Rails'ers are kind of critical of ActiveScaffold, it doesn't fit in with the 'Rails Way'.