我设置了一个rails应用,其中users
和widgets
之间存在多对多关系。 "用户"已经通过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
但我仍然得到同样的错误......
答案 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。