【问题标题】:Rails 3.2, nested resource, uninitialized constantRails 3.2,嵌套资源,未初始化常量
【发布时间】:2012-03-24 08:59:21
【问题描述】:

我在使用 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>

品牌.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

brands/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

【问题讨论】:

    标签: ruby-on-rails uninitialized-constant


    【解决方案1】:

    Brand 中的has_many 关系中,您使用一个符号,表示您的模型的复数名称(应该如此)。 Rails 现在需要从该符号中找到正确的模型类。为此,它大致执行以下操作:

    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
    

    所以罪魁祸首在于 Rails singularize 方法无法获得 series 的“正确”单数形式。如果一切都如您所愿,class_name 将是"Serie"(请注意最后缺少的s)。

    你很幸运,你可以告诉 Rails 使用指定的类名作为关系。因此,只需将您的 Brand 类更改为此,您就可以了:

    class Brand < ActiveRecord::Base
      has_many :series, :class_name => "Serie", :order => "name, id ASC", :dependent => :destroy
    end
    

    【讨论】:

    • 哇,谢谢它解决了!现在我也明白为什么我的重命名总是出错了:我只是在“series”前面添加了一些东西(比如“product_series”……我想作为一个非英语母语的人,我只是没有想到单数“系列”实际上是“系列”
    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多