在Rails应用程序中找不到表错误

时间:2016-02-28 23:17:51

标签: ruby-on-rails devise

我设置了一个rails应用,其中userswidgets之间存在多对多关系。 "用户"已经通过devise gem生成和管理。当我点击创建新小部件时,当以用户身份登录时,我收到错误:

  

WidgetsController中的ActiveRecord :: StatementInvalid #create

     

找不到表' users_widgets'

我的迁移文件如下:

class CreateWidgets < ActiveRecord::Migration
  def change
        create_table :widgets do |t|
            t.string :name
            t.timestamps null: false
        end
    end
    create_table :users_widgets, id: false do |t|
        t.belongs_to :user, index: true
        t.belongs_to :widget, index: true
    end
end

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
      #other devise stuff...
  end
end

和我的widget_controller

  def create
    @user = current_user
    @widget = @user.widgets.build(widget_params)

    respond_to do |format|
      if @widget.save
        format.html { redirect_to @widget, notice: 'Widget was successfully created.' }
        format.json { render :show, status: :created, location: @widget }
      else
        format.html { render :new }
        format.json { render json: @widget.errors, status: :unprocessable_entity }
      end
    end
  end

我做错了什么/导致此错误的原因是什么?我原以为createWidgets类中的定义是否足够?

更新

我已将create_widgets迁移文件更改为:

class CreateWidgets < ActiveRecord::Migration
  def change
    create_table :widgets do |t|
      t.string :name
      t.timestamps null: false
    end

    create_table :users_widgets, id: false do |t|
      t.belongs_to :user, index: true
      t.belongs_to :widget, index: true
    end
  end    
end

并运行:

$rake db:reset
$rake db:migrate

但我仍然得到同样的错误......

2 个答案:

答案 0 :(得分:3)

当您确信您的迁移是正确的但仍然存在这些问题时,它(有时)可能是因为先前的失败迁移使得dB处于难以调试的状态并且/或纠正。

在这些情况下,我经常这样做:

$ rake db:drop          # completely removes the database
$ rake db:create        # creates a new, empty database
$ rake db:migrate       # builds your tables
$ rake db:test:prepare  # prepares your test database

答案 1 :(得分:1)

按如下方式修复CreateWidgets迁移:

class CreateWidgets < ActiveRecord::Migration
  def change
    create_table :widgets do |t|
      t.string :name
      t.timestamps null: false
    end

    create_table :users_widgets, id: false do |t|
      t.belongs_to :user, index: true
      t.belongs_to :widget, index: true
    end
  end    
end

两个create_table语句都必须在change中,而不是在外面。

您是否在运行create_table迁移之前或之后为users_widgets添加了CreateWidgets

如果您在运行迁移后添加了它,则需要运行bundle exec rake db:migrate:redo或运行bundle exec rake db:migrate:rollback,然后运行bundle exec rake db:migrate。实质上,您需要确保此迁移已创建两个表。运行这些任务时,您可能需要添加STEP参数。

有关详细信息,请参阅Active Record Migrations