我遇到了Rails 3.2.1的问题,嵌套资源一直在抱怨一个未初始化的常量,我无法弄清楚为什么因为对我而言似乎我做的与使用不同的模型一样做得好。在某些时候,我以为我可能会在某处使用保留字,但更改模型名称并没有帮助......
错误:
uninitialized constant Brand::Series
Extracted source (around line #11):
8: </article>
9:
10:
11: <% @series.each do |serie| %>
12: <article class='serie_block'>
13: <%= serie.name %>
14: </article>
brand.rb
class Brand < ActiveRecord::Base
has_many :series, :order => "name, id ASC", :dependent => :destroy
end
serie.rb
class Serie < ActiveRecord::Base
belongs_to :brand
end
brands_controller.rb
def show
@brand = Brand.find(params[:id])
@series = @brand.series
end
品牌/ show.html.erb
<% @series.each do |serie| %>
<article class='serie_block'>
<%= serie.name %>
</article>
<% end %>
当我尝试创建一个新系列时,我得到了相同的“未初始化的常量Brand :: Series”错误,但它引用了“app / controllers / series_controller.rb:21:in”new“”,这就是这个“@serie = @ brand.series.build”。
series_controller.rb
# GET /Series/new
# GET /Series/new.json
def new
@brand = Brand.find(params[:brand_id])
@serie = @brand.series.build
respond_to do |format|
format.html # new.html.erb
format.json { render json: @serie }
end
end
现在奇怪的是,这种关系似乎有效,Rails并没有抱怨没有“系列”方法的“品牌”。但是系列对象的实际创建似乎失败了:s
答案 0 :(得分:1)
在has_many
的{{1}}关系中,您使用符号,表示模型的复数名称(应该是这样)。 Rails现在需要从该符号中找到合适的模型类。为此,它大致执行以下操作:
Brand
因此,罪魁祸首在于Rails singularize方法无法获得relation_name = :series # => :series
class_name = relation_name.singularize.classify # => "Series"
class_object = class_name.constantize # in the context of the Brand class: => Brand::Series
的“正确”单数形式。如果一切都按预期的那样完成,那么series
就会class_name
(注意到最后遗漏的"Serie"
)。
幸运的是,您可以告诉rails使用指定的类名作为关系。所以只需将您的s
课程更改为此,您就可以了:
Brand