# Rails Noob, Math or Array Issue?

**URL:** <https://www.ruby-forum.com/t/rails-noob-math-or-array-issue/109430>\
**Category:** Rails\
**Created:** [July 14, 2007, 8:16pm UTC](https://www.ruby-forum.com/t/rails-noob-math-or-array-issue/109430 "2007-07-14T20:16:21Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [July 14, 2007, 8:16pm UTC](https://www.ruby-forum.com/t/rails-noob-math-or-array-issue/109430/1 "2007-07-14T20:16:21Z")

</div>

Let’s say that below is the math for figuring out a unit in a popular  
diet program:

```
@fiber = Array.new(@food.fiber, 4)
@points = (@food.calories / 50) + (@food.fat / 12) - (@fiber.min /

```

1. 

And that for personal use, I’m creating a system to keep track of  
these units on a daily basis and I’m simply rendering @points in the  
following manner in my view:

**Points:** \<%= @points %\>

But when @points equals 0, I get the nasty message:

NoMethodError in FoodsController#show

You have a nil object when you didn’t expect it!  
The error occurred while evaluating nil./

What would one do to make it OK to have a 0 instead of causing it to  
evaluate nil?

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [July 14, 2007, 8:19pm UTC](https://www.ruby-forum.com/t/rails-noob-math-or-array-issue/109430/2 "2007-07-14T20:19:21Z")

</div>

I goofed up…when the minimum of @fiber = 0, I get the nasty  
message…not when @points = 0. I apologize.

On Jul 14, 2:15 pm, “removed\_email\_address@domain.invalid” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [July 14, 2007, 9:17pm UTC](https://www.ruby-forum.com/t/rails-noob-math-or-array-issue/109430/3 "2007-07-14T21:17:25Z")

</div>

Finally figured it out on my own with some modifications…

Controller:  
def show  
@food = Food.find(params[:id])  
@fiber = Array.new(@food.fiber.to\_f, 4)  
@points = (@food.calories.to\_f / 50) + (@food.fat.to\_f / 12) -  
((@fiber.min.to\_f) / 5)  
end

View:

**Points:** \<%= @points.round %\>

Seems to produce the results I want…any better way would be welcome.

On Jul 14, 2:18 pm, “removed\_email\_address@domain.invalid” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [July 14, 2007, 9:29pm UTC](https://www.ruby-forum.com/t/rails-noob-math-or-array-issue/109430/4 "2007-07-14T21:29:24Z")

</div>

hmm,  
I don’t understand you Array.new statement

Array.new(x, 4) just returns an array with x lots of 4  
Array.new(7, 4) = [4,4,4,4,4,4,4]  
Array.new(7.3,4) = [4,4,4,4,4,4,4]

@fiber = Array.new(x, 4)  
@fiber.min = 4

whatever the x is.

I’d put all the code in the model

class Food  
def points  
value = 0  
value += (calories.to\_f / 50) if calories  
value += ( fat.to\_f / 12) if fat  
value += ( fiber.to\_f / 5) if fiber  
return value  
end  
end

and just call @food.points in your view

the problem you were having at the start was because one of these  
attributes (calories, fat or fiber)  
was nil for the model,  
I suggest setting :default =\> 0 in the migration.  
Then you can get rid of the "if"s in the code above

removed\_email\_address@domain.invalid wrote:

> Finally figured it out on my own with some modifications…
> 
> Controller:  
> def show  
> @food = Food.find(params[:id])  
> @fiber = Array.new(@food.fiber.to\_f, 4)  
> @points = (@food.calories.to\_f / 50) + (@food.fat.to\_f / 12) -  
> ((@fiber.min.to\_f) / 5)  
> end
> 
> View:
> 
> **Points:** \<%= @points.round %\>
> 
> Seems to produce the results I want…any better way would be welcome.
> 
> On Jul 14, 2:18 pm, “removed\_email\_address@domain.invalid” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [July 17, 2007, 3:49pm UTC](https://www.ruby-forum.com/t/rails-noob-math-or-array-issue/109430/5 "2007-07-17T15:49:24Z")

</div>

What I need is something that returns the minimum of food.fiber or 4,  
whichever is lower. I appreciate your help–I’m just a programming  
idiot to begin with and even moreso at Ruby/Rails.

On Jul 14, 3:29 pm, Matthew R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
