what am i doing?

this is my first application in RoR and am kind of stuck. part of my
confusion is where/when to use the model, controller or view.

one of my tables is called gi_maps which is basically a hash:

select * from gi_maps;

id>name
1|Gi
2|No-Gi

another is called divisions which has gi_maps hash and others:

select * from divisions;

id>gi_map_id|rank_map_id|weight_group_map_id|age_group_map_id|
created_at|updated
_at
3|2|4|4|3|2008-09-05 21:28:32|2008-09-05 21:28:32
4|1|6|4|3|2008-09-05 21:29:01|2008-09-05 21:29:01

my default show "view" (divisions/show.html.erb) just displays the
id's for each entry:

Gi or No-Gi Rank Weight group Age group
2 4 4 3 Show Edit Destroy
1 6 4 3 Show Edit Destroy

divisions/show.html.erb:
.
.
<p>
  <b>Gi or No-Gi:</b>
  <%=h @division.gi_map_id %>
</p>
.
.
.

so all of this works fine... except for the fact that people like to
see words instead of numbers :slight_smile: so what i've tried to do is use my
model (models/division.rb) to "collect" the corresponding "name" value
for a given hash id (ie. gi_map_id). but for some reason this isn't
working and i can't think of any other way to do it except for placing
it in the controller or view section. but i *think* this should be
done at the model level.

here are the files and errors the way i'm doing it (i'll truncate the
files for readability):

models/gi_map.rb:

class GiMap < ActiveRecord::Base
  belongs_to :divison
end

models/division.rb:

class Division < ActiveRecord::Base

  belongs_to :match

  def self.gi_map_name
    GiMap.first(:conditions => ["id = ?", self.id]).name
  end
end

controllers/divisions_controller.rb:
.
.
  def show
    @division = Division.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml { render :xml => @division }
    end
  end
.
.

views/divisons/show.html.rb:
.
.
<p>
  <b>Gi or No-Gi:</b>
  <%=h @division.gi_map_name %>
</p>
.
.
.

and here is the error when trying to "show" one record:

NoMethodError in Divisions#show

Showing divisions/show.html.erb where line #3 raised:

undefined method `gi_map_name' for #<Division:0x478b9b0>

Extracted source (around line #3):

1: <p>
2: <b>Gi or No-Gi:</b>
3: <%=h @division.gi_map_name %>
4: </p>
5:
6: <p>

i hope this isn't a total noob question! but i've already written
this application in php/mysql and am just rewriting in an effort to
learn RoR. so any help or tips would be greatly appreciated.

thanks!

ron

Defining methods with the self prefix denotes a class method. You are calling the method on an instance object. Remove the self and you will be good to go.

this is my first application in RoR and am kind of stuck. part of my
confusion is where/when to use the model, controller or view.

class Division < ActiveRecord::Base

belongs_to :match

def self.gi_map_name
GiMap.first(:conditions => ["id = ?", self.id]).name
end
end

You've created a class method (that's what def self. does) whereas
this should really be an instance method.
Usually you'd handle this via some associations. GiMap should have
has_one :division (and not belongs_to :division - that would indicate
that the gi_maps table has a division_id column) and division should
belongs_to :gi_map (and it does as required have a gi_map_id column).

Then you'd just write (I suspect that personally I wouldn't bother)

def gi_map_name
  gi_map.name
end

Fred

wow! i was pretty far off :slight_smile: thanks for the tips! i would like to
know more about when/where and what the implications are for using the
has_one, belongs_to, etc. keywords. any links that would help me
better understand what the hell i'm doing ? :slight_smile:

btw... i DO get what you are saying... after changing the belongs_to
and has_one... i can just do this in my view:

<p>
  <b>Gi or No-Gi:</b>
  <%=h @division.gi_map.name %>
</p>

thanks again!

http://railscasts.com/episodes/3-find-through-association