0

我有一個帳號表,其名稱和編號列上沒有空約束。 我也有這樣的一段代碼爲「賬戶」控制器創建行動:Rails「NOT NULL約束失敗:table.column」

def create 
    account_number = rand.to_s[2..9] 
    @account = Account.new(user_id: current_user.id, name: 'hello', number: account_number) 

    respond_to do |format| 
     if @account.save 
      format.html { redirect_to @account, notice: "Account was successfully created.\n Your account number is: #{account_number}" } 

和我的「賬戶」的模式很簡單:

class Account < ApplicationRecord 
    belongs_to :user 

    attr_accessor :name 
    attr_accessor :number 
    attr_accessor :amount 
end 

但是,當我去/帳號/新並提交,它給了我這個錯誤:

NOT NULL constraint failed: accounts.name

但是爲什麼?因爲我在構造函數中用「hello」硬編碼了「name」屬性,所以爲什麼不用「hello」填充「name」列?

+0

可以請你發佈表架構 –

+0

我最後的遷移是: 類AddAccountsNotNullConstraint <的ActiveRecord ::遷移[5.0] 高清更改 change_column:帳戶,:名稱,:編號,日期null =>假 結束 結束 其中也破壞了從字符串到「十進制」的「名稱」的類型 –

回答

1

Account中刪除attr_accessor來電。它們可能會覆蓋從您的模式生成的內置方法,這會導致許多問題。

您是否創建並運行遷移以將這些屬性添加到accounts表中?

+0

是的,我做到了,你是對的。我剛剛刪除了attr_accessors,問題就解決了。謝謝:) –

0

如果您有:user_id,:name,:number:amount字段,您不需要爲它們添加attr_accessor

此外,您可以在:name上添加模型級驗證,以避免出現database-level錯誤。

class Account < ApplicationRecord 
    belongs_to :user 

    validates :name, presence: true 
end 
+0

但是,它不會以任何方式導致錯誤?我的意思是這種迴避的確切優勢是什麼? –

+0

這會返回模型本身的錯誤。在驗證滿足之前,它不會進入數據庫 –

+0

這樣它不會破壞數據庫級別的非空約束,但會正確地爲您提供「名稱不能爲空」的驗證消息,並且會再次重新編輯頁面如果你正在渲染它 –

相關問題