Ruby未初始化的常量名称错误

时间:2012-03-10 15:58:32

标签: ruby-on-rails ruby nameerror inflection

我有这个奇怪的错误,我不明白。我将模型User定义为:

class User < ActiveRecord::Base
validates_presence_of :name, :email

has_many :caves
end

关联模型Cave定义为:

class Cave < ActiveRecord::Base
  belongs_to :user
end

在我的用户的show方法中,我提议创建一个新的洞穴:

<%= form_for([@user, @user.caves.build]) do |f| %>
<div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name %>
</div>
<div class="actions">
  <%= f.submit %>
</div>

但是当我显示页面时,我收到以下错误:

NameError in Users#show
Showing E:/Vinisync/app/views/users/show.html.erb where line #19 raised:

uninitialized constant User::Cafe

Extracted source (around line #19):
16: </p>
17: 
18: <h2>Add a Cave</h2>
19: <%= form_for([@user, @user.caves.build]) do |f| %>
20:   <div class="field">
21:     <%= f.label :name %><br />
22:     <%= f.text_field :name %>

我不知道这个'咖啡馆'来自哪里,我的代码中没有这个词!
我注意到的是,如果我将User.rb中的关联重命名为has_many :cave而不是has_many :caves当前(并在用户的show.html.erb中更改它的形式,页面显示通常。但是我的关系是一对一的,所以它应该在用户中读作“洞穴”,而不是“洞穴”。我相信我已经在SO和其他地方阅读了所有相关问题,但我似乎没有任何解决方案适用

3 个答案:

答案 0 :(得分:4)

听起来Rails并没有意识到洞穴的奇异就是洞穴。您可以在config / initializers / inflections.rb中手动设置:

inflect.irregular 'cave', 'caves'

然后它会尝试找到Cave而不是Cafe。

答案 1 :(得分:1)

你的问题是Ruby使用了一些“创造性的”Inflector来单独化你的“洞穴”并最终产生“咖啡馆”。

您可以在配置中修复inflections.rb中的行为。

答案 2 :(得分:-1)

错误指向您的show.html.erb视图文件,而不是您的new.html.erb视图文件。

也许你有show.html.erb的拼写错误。检查一下!