另一个新手问题。
目标:每种成分可以有零个或多个单位转换。我想在显示特定成分的页面上创建一个新的单位转换链接。我无法让它发挥作用。
成分模型:
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'
帮助!我对此都很不满。
答案 0 :(得分:23)
new
和create
的单位转换控制器应为:
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