Martin Solli
2005-Dec-27 12:36 UTC
Re: RESOLVED: Overloading error_message_on method in ActiveRecordHelper
Leaving the body of the method the same as the default still throws the "stack level too deep" error. As a matter of fact, it only disappears if I comment out the ''require'' in line 1. As it turned out, it was the method definiton itself that caused problems. Ruby doesn''t have keyword arguments, but I tried calling the method as if it had. But when I changed the definiton to one with a hash that simulates keywords, it works just fine: --- module ActionView module Helpers module ActiveRecordHelper def error_message_on(object, method, params = nil) if params.class == Hash prepend_text = params[:prepend_text] || "" append_text = params[:append_text] || "" css_class = params[:css_class] || "formError" span = params[:span] || false end if errors = instance_variable_get("@#{object}").errors.on(method) content_tag(span ? "span" : "div", "#{prepend_text}#{errors.is_a?(Array) ? errors.first : errors}#{append_text}", :class => css_class) end end end end end --- I don''t know if this is the proper way to do it, but it seems to work. Now I can use <%= error_message_on(''user'', ''first_name'', :span => true) %> in my templates when I want my error messages in a <span> instead of in a <div>. -martin On 12/23/05, David Lee <david-4y1Gq2eXLBXvnOemgxGiVw@public.gmane.org> wrote:> I''m trying to do something quite similar myself for the first time. > > i''ll offer one piece of advice: putting that code in a file that also > contains a model or helper means you don''t have to restart the server > to see your changes, which makes debugging the thing a lot easier > (thats not a deployment strategy mind you). > > If you leave the body of your method the same as AR''s default does it > still throw the ''stack too deep'' ? > > cheers, > David > > > On 23/12/2005, at 11:51 PM, Martin Solli wrote: > > > Hello all > > > > I would like to overload the error_message_on method in the > > ActiveRecordHelper module in order to emit a span tag instead of a div > > tag. I try to achieve this by way of plugins: Under vendor/plugins > > I''ve made a error_messages_on_fix directory, containing init.rb like > > this: > > --- > > require ''active_record_helper_fix'' > > --- > > > > ..and a lib directory with active_record_helper_fix.rb like this: > > --- > > require ''action_view/helpers/active_record_helper'' > > > > module ActionView > > module Helpers > > module ActiveRecordHelper > > def error_message_on(object, method, prepend_text = "", > > append_text = "", css_class = "formError", span = false) > > if errors = instance_variable_get("@#{object}").errors.on > > (method) > > content_tag(span ? "span" : "div", > > "#{prepend_text}#{errors.is_a?(Array) ? errors.first : > > errors}#{append_text}", :class => css_class) > > end > > end > > end > > end > > end > > --- > > > > My plan is to be able to use this method with a call like this: > > error_message_on(''user'', ''last_name'', :span => true) > > > > This results in my application coming tumbling down with this error: > > --- > > Showing app/views/user/_form.rhtml where line #3 raised: > > stack level too deep > > Extracted source (around line #3): > > 1: <div class="user_first_name"> > > 2: <p><label for="user_first_name">Fornavn</label><br /> > > 3: <%= text_field(''user'', ''first_name'', ''size'' => 25) %> > > 4: <%= error_message_on(''user'', ''first_name'') %></p> > > 5: </div> > > --- > > > > I feel that the problem may be my lack of understanding of how modules > > work in Ruby. Or I''m trying to do something simple in a hard way. I > > don''t know. I would appreciate some tips on how to achieve this. > > > > -martin > > _______________________________________________ > > Rails mailing list > > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > > http://lists.rubyonrails.org/mailman/listinfo/rails > > _______________________________________________ > Rails mailing list > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > http://lists.rubyonrails.org/mailman/listinfo/rails >