has_many método de construcción, Rails

Otra pregunta de novato.

El objective: cada ingrediente puede tener cero o más conversiones de unidades vinculadas a él. Quiero poner un enlace para crear una nueva unidad de conversión en la página que muestra un ingrediente específico. No puedo hacerlo funcionar.

Modelo de ingredientes:

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

Modelo de conversión de unidad:

 class UnitConversion < ActiveRecord::Base belongs_to :Ingredient end 

Unidad de controlador de conversión (para nuevo)

 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 

Rutas relevantes:

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

Mostrar enlace de ingredientes:

  

Este es el error:

  NoMethodError in Unit conversionsController#new undefined method `unit_conversions' for # 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' 

¡Ayuda! Estoy confundido acerca de esto.

Controlador de conversión de unidad para new y create debe ser:

 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 

Además, este screencast es un buen recurso para recursos nesteds.

 has_many :unit_conversion 

Debería estar pluralizado ya que lo estás llamando con

 @unit_conversion = @ingredient.unit_conversions.build 

su controlador

 def new @ingredient = Ingredient.all 

debe llamar a #new para configurar un nuevo ingrediente o #find para agarrar un ingrediente existente.

 @ingredient = Ingredient.new # returns a new Ingredient 

o

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

El que elija depende de sus necesidades.

Además, este es un error tipográfico, ¿verdad?

 belongs_to :Ingredient 

Es posible que desee minúsculas :ingredient