【问题标题】:Rails: NameError uninitialized constant on Database RelationshipRails:数据库关系上的 NameError 未初始化常量
【发布时间】:2018-03-05 16:56:28
【问题描述】:

我有一个名为“cube”的模型,它代表一组交易卡:

app/models/cube.rb

class Cube < ApplicationRecord
  has_many :cubecards
  validates :name, length: { in: 3..30 }
end

如您所见,此模型与 cube_cards 具有 has_many 关系:

app/models/cube_card.rb

class CubeCard < ApplicationRecord
  belongs_to :cube
end

在关注this rails guide 以帮助创建这种关系时,代码引用了这种表单样式:

<%= form_with(model: [ @article, @article.comments.build ], local: true) do |form| %>

出于测试目的,我只是想让人们输入一个与卡ID对应的数字,所以我有以下表格:

app/views/cubes/show.html.erb

<%= form_with(model: [ @cube, @cube.cubecards.build ], local: true) do |form| %>
  <p>
    <%= number_field(:card, :id, in: 1.0..8000.0, step: 1) %>
  </p>
  <p>
    <%= form.submit %>
  </p>
<% end %>

问题是,@cube.cubecards.build 给我带来了麻烦:rails 为Cube::CubeCard 抛出一个未初始化的常量错误。

在其他线程中,我注意到plurality 一直是a common issue,但我在这里找不到任何问题。

我还注意到this fellow had a similar issue,但据我所知,接受的解决方案不适用于我的代码,并且投票率高的解决方案与控制器有关。这是我的立方体卡片控制器:

app/controllers/cube_cards_controller.rb

class CubeCardsController < ApplicationController
  def create
    @cube = Cube.find(params[:cube_id])
    @cubecard = @cube.cubecards.create(cubecard_params)
    redirect_to cube_path(@cube)
  end

  private
    def cubecard_params
      params.require(:cubecard).permit(:card)
    end
end

再次澄清,cube 可以有 许多 cube_cards

我也尝试将cubecard的复数改为cubecards,添加下划线(cubecard -> cube_cardcube_cards),甚至大写cubecard -> CubeCardCubeCards 无济于事。

我正在关注的教程似乎直接跳到表单没有一个问题,所以我知道,作为一个新手,我一定犯了一些基本错误,但我已经工作了大约一天现在没有明显的解决方案。

我在 Windows 7 机器上本地运行它,并计划在完成后将其迁移到 Web 主机。

如果有帮助,我已经发布代码on github

NameError in Cubes#show

Showing C:/Sites/pokecube/app/views/cubes/show.html.erb where line #25 raised:

uninitialized constant Cube::Cubecard

Extracted source (around line #25):

<p>
  Add a Card:
  <%= form_with(model: [ @cube, @cube.cubecards.build ], local: true) do |form| %>
  <p>
    <%= number_field(:card, :id, in: 1.0..8000.0, step: 1) %>
  </p>

另外,我的控制台显示以下错误:

Completed 500 Internal Server Error in 69ms (ActiveRecord: 1.0ms)

ActionView::Template::Error (uninitialized constant Cube::Cubecard):
22:
23: <p>
24:   Add a Card:
25:   <%= form_with(model: [ @cube, @cube.cubecards.build ], local: true) do |form| %>
26:   <p>
27:     <%= number_field(:card, :id, in: 1.0..8000.0, step: 1) %>
28:   </p>

app/views/cubes/show.html.erb:25:in `_app_views_cubes_show_html_erb___540381856_44810532'

【问题讨论】:

  • 你的 github repo 中的代码没有针对 Cube 数据库的迁移?
  • @StephanePaquet,我添加了文件并重新提交。我移动它是为了放下桌子。我一直在使用 db:migrate 删除 cubecards 表并重新添加它,我不希望多维数据集迁移中的任何东西妨碍
  • 请发布实际错误。您只是在展示您认为可能是错误的内容,而不是实际错误的内容。如果两者相同,则无需提问。
  • @jamesc 我很抱歉没有首先发布它。你确实提出了一个令人信服的观点。我已经用所有错误信息编辑了原始帖子。

标签: ruby-on-rails one-to-many nameerror uninitialized-constant


【解决方案1】:

我找到了解决此问题的方法。不幸的是,我陷入了许多与之前提出类似问题的人相同的陷阱:这里的问题源于我的变量命名不当。

我可以通过将 @cube.cubecards 更改为 @cube.cube_cards 来修复代码

另外,在参数中,我将:cubecard 更改为:cube_card

事实证明,我应该使用 cubecard 的唯一一次是在每个文件开头的 Class 声明中。其他所有内容都引用了表 cube_cards,因此应该以这种方式准确拼写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 2017-07-10
    • 2022-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    相关资源
    最近更新 更多