2010-01-03 14 views
12

Eine weitere Neuling Frage.has_many Build-Methode, Rails

Das Ziel: Jede Zutat kann null oder mehr Einheiten Conversions gebunden haben. Ich möchte einen Link zum Erstellen einer neuen Einheitenkonvertierung auf der Seite einfügen, die eine bestimmte Zutat enthält. Ich kann es nicht richtig zur Arbeit bringen.

Ingredient Modell:

class Ingredient < ActiveRecord::Base 
    belongs_to :unit 
    has_many :unit_conversion 
end 

Unit Conversion Model:

class UnitConversion < ActiveRecord::Base 
    belongs_to :Ingredient 
end 

Unit Conversion Controller (für neu)

def new 
    @ingredient = Ingredient.all 
    @unit_conversion = @ingredient.unit_conversions.build(params[:unit_conversion]) 
    if @unit_conversion.save then 
     redirect_to ingredient_unit_conversion_url(@ingredient, @comment) 
     else 
      render :action => "new" 
     end 
    end 

Relevante Routen:

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

anzeigen Ingredient-Link:

<%= link_to 'Add Unit Conversion', new_ingredient_unit_conversion_path(@ingredient) %> 

Dies ist der Fehler:

NoMethodError in Unit conversionsController#new 

undefined method `unit_conversions' for #<Array:0x3fdf920> 

RAILS_ROOT: C:/Users/joan/dh 
Application Trace | Framework Trace | Full Trace 

C:/Users/joan/dh/app/controllers/unit_conversions_controller.rb:14:in `new' 

Hilfe! Ich bin total durcheinander.

Antwort

23

Unit Conversion Controller für new und create sollte sein:

def new 
    @ingredient = Ingredient.find(params[:ingredient_id])  
    @unit_conversion = @ingredient.unit_conversions.build 
end 

def create 
    @ingredient = Ingredient.find(params[:ingredient_id])  
    @unit_conversion = @ingredient.unit_conversions.build(params[:unit_conversion]) 

    if @unit_conversion.save 
    flash[:notice] = "Successfully created unit conversion." 
    redirect_to ingredient_unit_conversions_url(@ingredient) 
    else 
    render :action => 'new' 
    end 
end 

Auch dieses screencast ist eine schöne Ressource für verschachtelte Ressourcen.

5
has_many :unit_conversion 

Sollte pluralized werden, da Sie es nennen sind mit

@unit_conversion = @ingredient.unit_conversions.build 

Ihr Controller

def new 
    @ingredient = Ingredient.all 

sollte eine neue Zutat oder #find greifen einen vorhandenen Zutaten #new einrichten anrufen.

@ingredient = Ingredient.new  # returns a new Ingredient 

oder

@ingredient = Ingredient.find(...) # returns an existing Ingredient 

Welche Sie wählen, bis zu Ihren Anforderungen ist.

Auch das ist ein Tippfehler, oder?

belongs_to :Ingredient 

Vielleicht möchten :ingredient

in Kleinbuchstaben