2010-01-02 5 views
4

Complete rails newbie essayant de commencer.Rails: méthode indéfinie `map 'pour l'ingrédient

J'ai deux classes, Ingrédient et Unité. Il y a trois unités, lb, gallons et douzaines, et chaque ingrédient a exactement une unité. Je pense avoir mis en place les associations/routes correctement. Lors de la création d'un nouvel ingrédient, je dois demander à l'utilisateur de définir les unités à partir de ces trois éléments. je une autre question pour en arriver là: Drop Down Box - Populated with data from another table in a form - Ruby on Rails

Modèle pour Ingrédients:

class Ingredient < ActiveRecord::Base 
    belongs_to :unit 
end 

Modèle pour les unités:

class Unit < ActiveRecord::Base 
end 

Routes:

map.resources :ingredients, :has_many => :unit_conversions 
    map.resources :units, :has_many => :ingredients 

Ingrédients Nouveau contrôleur

def new 
    @ingredient = Ingredient.new 

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

Ingrédients Vue:

<h1>New ingredient</h1> 

<% form_for(@ingredient) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </p> 
    <p> 
    <%= f.label :needsDefrosting %><br /> 
    <%= f.check_box :needsDefrosting %> 
    </p> 
    <p> 
    <%= f.label :baseName %> 
    <%= f.collection_select :unit_id, @ingredient, :id, :baseName, :prompt => "Select a Base Measurement"%> 
    <br /> 
    </p> 
    <p> 
    <%= f.submit 'Create' %> 
    </p> 
<% end %> 

<%= link_to 'Back', ingredients_path %> 

L'erreur est

NoMethodError in Ingredients#new 

Showing app/views/ingredients/new.html.erb where line #16 raised: 

undefined method `map' for #<Ingredient:0x3dae1c0> 

Extracted source (around line #16): 

13: </p> 
14: <p> 
15: <%= f.label :baseName %> 
16: <%= f.collection_select :unit_id, @ingredient, :id, :baseName, :prompt => "Select a Base Measurement"%> 
17: <br /> 
18: </p> 
19: <p> 

RAILS_ROOT: C:/Users/joan/dh 

Je suis seulement trois jours au fond de RoR, donc je pense qu'il est simple!

Répondre

6

collection_select a besoin d'un tableau d'options, vous passez un ingrédient. Changer @ingredient à Unit.all devrait le réparer.

%= f.collection_select :unit_id, Unit.all, :id, :baseName, :prompt => "Select a Base Measurement"%> 

Comme une note de côté si vous ne va jamais avoir 3 types d'unités, il serait plus logique de créer un lieu constant d'avoir une table pour les unités. Cela réduirait le nombre de jointures et rendrait le modèle global un peu plus simple.

0

Les associations de vos classes de modèle sont incorrectes selon votre description de la relation entre les ingrédients et les unités. Il devrait être:

class Ingredient < ActiveRecord::Base 
    has_one :unit 
end 

class Unit < ActiveRecord::Base 
    belongs_to :ingredient 
end 
+0

mais mon impression de la documentation/lecture, est que si vous utilisez has_one, chaque fois que j'ajouter une nouvelle ingrédient, j'ajoute aussi une nouvelle unité. Je ne veux pas ça. Il n'y a que trois unités, j'ai juste besoin que chaque ingrédient soit associé exactement à un. – Joan

+0

L'association 'has_one' fait cela. –

-2

Si vous êtes dans un rail 3 application, le fichier routes devrait ressembler à ceci

YouAppName::Application.routes.draw do 

    resources :ingredients 

    resources :units 

end 
Questions connexes