【问题标题】:rails cannot create a new itemrails 无法创建新项目
【发布时间】:2017-06-15 02:37:11
【问题描述】:

我正在创建一个小型 Rails 应用程序,我遇到了一个我认为是在我的数据库后端的问题,但我不知道如何解决它。最终发生的事情是,如果我尝试访问我的 new 网址,我会收到一条错误消息,指出 PG::UndefinedTable: ERROR: relation "caves" does not exist LINE 8: WHERE a.attrelid = '"caves"'::regclass

我要做的就是创建一个新的cafe 我去localhost:3000/cafes/new 但由于一些非常烦人的原因,洞穴不知何故混入其中,我不知道如何解决这个问题。

我的控制器基本上在下面。 (此时我的控制器中的其余项目都是空方法)

  def new
    @cafe = Cafe.new
  end

  def create
    @cafe = Cafe.new(cafe_params)
  end

  private

  def cafe_params
    params.require(:name, :description)
  end

我的架构表是

  enable_extension "plpgsql"

  create_table "cafes", force: :cascade do |t|
    t.string "name"
    t.text "description"
  end

  create_table "users", force: :cascade do |t|
    t.string "first_name"
    t.string "last_name"
    t.string "email"
    t.integer "age"
  end

我现在有两个空模型,一个叫user.rb,另一个叫cafe.rb

这是我真正感到困惑的地方,因为我的模型中没有洞穴关系。

class Cafe < ApplicationRecord
end

这就是我在哪里。有人知道我能用这个做什么吗?我在想某处可能有一个重复的数据库,它需要被销毁。我已经尝试了 rake db:drop + rake db:create + rake db:migrate 路线,但没有运气。我知道有一种方法可以通过直接 psql 打开我的数据库,我认为这可能是真正调试这个问题的方法。 (我看过一次,但是不记得怎么做了,更别说只知道活动记录,不知道sql)

有人知道这里发生了什么吗?或者有谁知道如何进入 psql 以及如何找到类似的东西?

我真的很感激。

【问题讨论】:

  • 错误说关系“caves”而你的模型是“cafe”,有拼写错误吗?
  • 你能展示你的模型吗?
  • 我认为可能有一些拼写相关的东西,但我有什么,我没有看到它。

标签: mysql ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

你跑过rake db:createrake db:migrate吗?

因为使用模型名称Cafe 构建的表名是caves

所以尝试运行rake db:createrake db:migrate。并重新启动 rails server 将解决您的问题。

pry(main)> 'Cafe'.tableize
=> "caves"

【讨论】:

  • 嗨,小伙伴,感谢您的关注。这是我首先尝试的事情之一,但并没有完全解决问题。我想在我把东西放在一起的时候,整个caves 混在一起了,不管我对数据库做了什么,它仍然在那里徘徊。
【解决方案2】:

如果您希望 cafe 的复数形式解析为 cafes 而不是 rails 默认情况下的 caves,您可以使用变形来解决此问题

为此,请将其添加到您的config/initializers/inflections.rb

ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'cafe', 'cafes'
end

【讨论】:

  • 这最终解决了问题并允许我继续。老实说,我不明白什么是主动支持变形器,但我很高兴我能够让它继续下去。您是否碰巧知道一些关于变形的好文档,我可以研究一下?
  • rails 的 ActiveRecord 将表名如 leaves 解析为 ActiveRecord 模型类 Leafcaves 到 ActiveRecord 模型类 Cafe,反之亦然(即带有 'ves' 的表被解析为单数默认情况下带有'f'的模型类..因此,如果您需要其他方式,则可以将那些假定的翻译更改为变形器..当您在config/initializers/inflections.rb中配置上述首选翻译时,这意味着cafe是表上的单个条目cafes 不是 caves .. 你可以在这里阅读更多信息 api.rubyonrails.org/classes/ActiveSupport/Inflector.html .. 希望这会有所帮助!
【解决方案3】:

def new
    @cafe = Cafe.new
  end

  def create
    @cafe = Cafe.new(cafe_params)
    @cafe.save
  end

  private

  def cafe_params
    params.require[:modelname].permit(:name, :description)
  end

试试这个代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多