has_many构建方法,Rails

时间:2010-01-03 01:40:25

标签: ruby-on-rails

另一个新手问题。

目标:每种成分可以有零个或多个单位转换。我想在显示特定成分的页面上创建一个新的单位转换链接。我无法让它发挥作用。

成分模型:

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

单位转换模型:

class UnitConversion < ActiveRecord::Base
  belongs_to :Ingredient
end

单位换算控制器(换新)

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

相关路线:

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

显示成分链接:

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

这是错误:

 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'

帮助!我对此都很不满。

2 个答案:

答案 0 :(得分:23)

newcreate的单位转换控制器应为:

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

此外,这个screencast是嵌套资源的一个很好的资源。

答案 1 :(得分:6)

has_many :unit_conversion

由于您使用

调用它,因此应该是复数形式
@unit_conversion = @ingredient.unit_conversions.build

你的控制器

def new
  @ingredient = Ingredient.all

应该调用#new来设置新的成分,或者#find来获取现有的成分。

@ingredient = Ingredient.new       # returns a new Ingredient

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

您选择的是符合您要求的。

另外,这是一个错字,对吧?

belongs_to :Ingredient

您可能希望小写:ingredient