【问题标题】:Ruby on Rails "uninitialized constant" errorRuby on Rails“未初始化的常量”错误
【发布时间】:2015-04-26 03:32:01
【问题描述】:

我正在创建一个使用报价跟踪客户的应用程序。客户有很多报价,一个属于一个客户。我正在尝试使用一种结合名字和姓氏字段来生成全名的方法。我的代码如下。

客户模型:

class Customer < ActiveRecord::Base
  has_many :quotes
  def full_name
    "#{FName} #{LName}"
  end
end

引用form.html.erb

<div class="field">
  <%= f.label :Customer_Name %><br>
  <%= collection_select :Quote, :Customer_id, Customer.all, :id, :full_name, {}, {:multiple => true} %>
  </div>

当我尝试创建新记录时,我收到“未初始化的常量 Customer::FName”错误。有人可以建议吗?

【问题讨论】:

  • 在rails中任何以大写或大写字母开头的都被认为是常量,FName和LName被称为常量,常量应该在使用前定义
  • 谢谢普拉莫德。这是我的问题,感谢您的帮助!

标签: ruby-on-rails ruby


【解决方案1】:

在 Ruby 中,任何以大写字母开头的标识符都是常量。

irb(main):001:0> FOO = 'bar'
=> "bar"
irb(main):002:0> FOO = 'baz'
(irb):2: warning: already initialized constant FOO
(irb):1: warning: previous definition of FOO was here
=> "baz"
irb(main):003:0> 

所以作为常量的类名用驼峰写法(GhostWriter),属性和方法通常用snake_case写。

实际常量全部大写。

所以把它们放在一起

class Square # the class name Square is a constant
  SIDES = 4 # a constant

  attr_accessor :height 
  attr_accessor :width
  attr_accessor :background_color # attributes are written in snakecase

  def area 
    @height * width
  end

  def get_point # so are method names.
  end 
end

【讨论】:

  • 问题是我用大写命名我的属性,这使它们成为常量。感谢您的帮助和及时回复。我真诚地感谢它!
  • 没有什么强迫你用蛇形大小写方法名——Ruby只关心第一个字母的大小写,如果你称它为firstNamefIrStNaMe,它不会抱怨。然而其他程序员会因为这是公认的风格。
  • 没有什么能阻止你在全大写或首字母大写的情况下编写方法。将Kernel#Float 视为许多类似方法的单个样本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
相关资源
最近更新 更多