2016-02-28 64 views
0

我有一個在userswidgets之間建立了多對多關係的rails應用程序。 「用戶」已通過devise寶石生成和管理。當我點擊創建新的窗口小部件,作爲用戶登錄時,我得到的錯誤:在Rails應用程序中找不到表格錯誤

ActiveRecord::StatementInvalid in WidgetsController#create

Could not find table '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類中的定義足夠了嗎?

更新:

我HVE改變了我的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

你實際運行您的遷移? – jvillian

+0

@jvillian是的,但是,請參閱我對其他問題的評論,因爲我正在努力重新遷移表格...... –

+1

要重新開始,請執行rake db:reset **或** rake db:drop;耙db:創建; rake db:migrate;耙數據庫:測試:準備 – jvillian

回答

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,而不是在外面。

您是否還在運行CreateWidgets遷移之前或之後爲users_widgets添加了create_table

如果您在運行遷移後添加了它,則需要運行bundle exec rake db:migrate:redo或運行bundle exec rake db:migrate:rollback,然後運行bundle exec rake db:migrate。基本上你需要確保這個遷移已經創建了兩個表。運行這些任務時可能需要添加STEP參數。

有關更多信息,請參閱Active Record Migrations

+0

謝謝!我試過運行'bundle exec rake db:migrate:redo',但是我得到這個錯誤信息「SQLite3 :: SQLException:no such table:users_widgets:DROP TABLE」users_widgets「C:in'migrate'」 –

+0

恐怕以後運行'rake db:reset'然後'rake db:migrate'如jvillian在Qs註釋中所建議的那樣,我仍然得到'could not find table error' - 任何想法? –

2

當你確信你的遷移是正確的,但你仍然有這些問題時,它可能(有時)是由於以前的失敗的遷移使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