John Merlino
2011-Mar-28 21:02 UTC
why does my method return an error if argument is not a number?
Hey all, I get the following error message: ActionView::TemplateError (class or module required for rescue clause) in app/vie$ app/helpers/format_helper.rb:116:in `divide_numbers'' Basically I have a field in database called Student Fails and I populate fields with data. Sometimes the value can be empty - not null, not integer, just empty because when user updates record they clear out field and update it. First in my progressbar file I render a partial called progressbar_item, passing in the string to the partial in render method as well as data parameters that I can use in my progressbar file: = render "dashboard/progressbar_item.html", :actual => @student_counters[:student_failed], :expected => cu.context.expected_student_failed, :title => "Student Fails" Now with the data parameters available in my view, I call the divide_numbers method with the values of those parameters so if expected_student_failed was an empty value in database, that empty value gets passed as the second argument: = render "dashboard/progressbar.html", :value => divide_numbers(actual.to_f, expected), :text => "#{actual} / #{expected}" Then the method is executed in format_helper: def divide_numbers(x, y) result = x / y result.to_s == ''NaN'' ? 0 : result rescue 0 end If y is nothing (empty), the error occurs. If y is an integer the error doesn''t occur. Doesn''t this line take all non numbers like empty and convert it to integer 0: result.to_s == ''NaN'' ? 0 : result If that''s the case, then why do I get the error? Will I be forced to do this (i haven''t tested this yet but I presume it would work): def divide_numbers(x, y) result = x / y if result.nil? result.to_s = 0 else result.to_s == ''NaN'' ? 0 : result end rescue 0 end Thanks for response. -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Phil Crissman
2011-Mar-28 21:15 UTC
Re: why does my method return an error if argument is not a number?
On Mon, Mar 28, 2011 at 4:02 PM, John Merlino <lists-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> Hey all, > > I get the following error message: > ActionView::TemplateError (class or module required for rescue clause) > in app/vie$ app/helpers/format_helper.rb:116:in `divide_numbers'' > > > Basically I have a field in database called Student Fails and I populate > fields with data. Sometimes the value can be empty - not null, not > integer, just empty because when user updates record they clear out > field and update it. First in my progressbar file I render a partial > called progressbar_item, passing in the string to the partial in render > method as well as data parameters that I can use in my progressbar file: > > > = render "dashboard/progressbar_item.html", :actual => > @student_counters[:student_failed], :expected => > cu.context.expected_student_failed, :title => "Student Fails" > > Now with the data parameters available in my view, I call the > divide_numbers method with the values of those parameters so if > expected_student_failed was an empty value in database, that empty value > gets passed as the second argument: > > = render "dashboard/progressbar.html", :value => > divide_numbers(actual.to_f, expected), :text => "#{actual} / > #{expected}" > > Then the method is executed in format_helper: > > def divide_numbers(x, y) > result = x / y >This line will raise an error if y is nil or blank... It won''t even get to the next line.> result.to_s == ''NaN'' ? 0 : result > rescue 0 > end > > If y is nothing (empty), the error occurs. If y is an integer the error > doesn''t occur. Doesn''t this line take all non numbers like empty and > convert it to integer 0: > result.to_s == ''NaN'' ? 0 : result > > If that''s the case, then why do I get the error? > > Will I be forced to do this (i haven''t tested this yet but I presume it > would work): > > def divide_numbers(x, y) > result = x / y > if result.nil? > result.to_s = 0 > else > result.to_s == ''NaN'' ? 0 : result > end > rescue 0 > end > > > Thanks for response. > > -- > 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Frederick Cheung
2011-Mar-28 21:17 UTC
Re: why does my method return an error if argument is not a number?
On Mar 28, 10:02 pm, John Merlino <li...-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> Hey all, > > I get the following error message: > ActionView::TemplateError (class or module required for rescue clause) > in app/vie$ app/helpers/format_helper.rb:116:in `divide_numbers'' > > Basically I have a field in database called Student Fails and I populate > fields with data. Sometimes the value can be empty - not null, not > integer, just empty because when user updates record they clear out > field and update it. First in my progressbar file I render a partial > called progressbar_item, passing in the string to the partial in render > method as well as data parameters that I can use in my progressbar file: > > = render "dashboard/progressbar_item.html", :actual => > @student_counters[:student_failed], :expected => > cu.context.expected_student_failed, :title => "Student Fails" > > Now with the data parameters available in my view, I call the > divide_numbers method with the values of those parameters so if > expected_student_failed was an empty value in database, that empty value > gets passed as the second argument: > > = render "dashboard/progressbar.html", :value => > divide_numbers(actual.to_f, expected), :text => "#{actual} / > #{expected}" > > Then the method is executed in format_helper: > > def divide_numbers(x, y) > result = x / y > result.to_s == ''NaN'' ? 0 : result > rescue 0 > endThat''s not legal ruby - where you''ve stuck a 0 it''s expecting a class name (which sort of exceptions the rescue clause should handle). You may be mixing things up with the one liner do_foo rescue 0. Also floats have a nan? method which would be a little nicer than that string comparison you have there> > If y is nothing (empty), the error occurs. If y is an integer the error > doesn''t occur. Doesn''t this line take all non numbers like empty and > convert it to integer 0: > result.to_s == ''NaN'' ? 0 : resultNot quite. That will only coerce NaN to 0, but it wouldn''t do anything to Infinity, and of course you wouldn''t even get to this line if y was something such that x / y was meaningless (ie y is not coercible to a numeric value). NaN isn''t a placeholder for anything that isn''t a number but for specific situations where it isn''t possible to come up with a more meaningful answer (eg 0.0/0 ) Fred> > If that''s the case, then why do I get the error? > > Will I be forced to do this (i haven''t tested this yet but I presume it > would work): > > def divide_numbers(x, y) > result = x / y > if result.nil? > result.to_s = 0 > else > result.to_s == ''NaN'' ? 0 : result > end > rescue 0 > end > > Thanks for response. > > -- > Posted viahttp://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.
Michael Pavling
2011-Mar-29 05:52 UTC
Re: why does my method return an error if argument is not a number?
On 28 March 2011 22:02, John Merlino <lists-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> If y is nothing (empty), the error occurs. If y is an integer the error > doesn''t occur.yup. "divide by zero" will do that...> Doesn''t this line take all non numbers like empty and > convert it to integer 0: > result.to_s == ''NaN'' ? 0 : result > If that''s the case, then why do I get the error?Unfortunately, your code is breaking before there, and I doubt it would work as you expect even if it did (I don''t think you can be sure the integer would be ''NaN'') Try this instead: def divide_numbers(x, y) (x / y) rescue 0 end -- 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.
John Merlino
2011-Mar-30 15:45 UTC
Re: why does my method return an error if argument is not a number?
Thanks for all the responses. My understanding it''s breaking when I try to pass nothing as an argument to that function because you can''t pass an undefined variable as an argument. -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Michael Pavling
2011-Mar-31 07:35 UTC
Re: Re: why does my method return an error if argument is not a number?
On 30 March 2011 16:45, John Merlino <lists-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> Thanks for all the responses. My understanding it''s breaking when I try > to pass nothing as an argument to that function because you can''t pass > an undefined variable as an argument.What''s the error message you get? "divide by zero"? or "1 parameter for 2"? You earlier said:> Sometimes the value can be empty - not null, not > integer, just empty because when user updates record they clear out > field and update it. > > = render "dashboard/progressbar.html", :value =>divide_numbers(actual.to_f, expected), : In this event, you *are* passing two parameters to the method, one as a float (which, if it started as an empty string, will be turned to 0.0) and the expected value, which may be nil (or an empty string), or a number. Is there anywhere you are ensuring it''s a float like you do the "actual" value? Maybe try: divide_numbers(actual.to_f, expected.to_f) ...to get more consistent results from a range of input values. BTW, have a play in the console too, to see what different combinations give you: >> 2/0 ZeroDivisionError: divided by 0 >> 2/"" TypeError: String can''t be coerced into Fixnum >> 2/nil TypeError: nil can''t be coerced into Fixnum >> 2/0.0 => Infinity >> ...try that with your divide_numbers method... HTH -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.