2

我有这个奇怪的错误,我不明白。我有一个模型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 和其他地方的所有相关问题,但我似乎没有一个解决方案适用。

4

3 回答 3

4

听起来 Rails 没有意识到 Caves 的单数是 Cave。您可以在 config/initializers/inflections.rb 中手动设置:

inflect.irregular 'cave', 'caves'

然后它会尝试寻找洞穴而不是咖啡馆。

于 2012-03-10T16:05:58.777 回答
1

您的问题是 Ruby 使用有点“创造性”的Inflector来单一化您的“Caves”并最终生成“Cafe”。

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

于 2012-03-10T16:08:19.457 回答
-1

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

也许你有一个错字show.html.erb。核实!

于 2012-03-10T16:14:10.737 回答