2016-01-22 130 views
3

爲什麼創建方法會創建nil記錄?Rails創建方法導致無記錄

我曾嘗試:

Dropdown.create(主題: 「測試」)

Dropdown.create({主題: 「測試」,subject_value: 「1」})

Dropdown.create({:subject =>「test」,:subject_value =>「1」})

全部結果nil記錄。

(0.1ms) begin transaction 
    SQL (0.6ms) INSERT INTO "dropdowns" ("created_at", "updated_at") VALUES (?, ?) [["created_at", "2016-01-21 23:58:04.979225"], ["updated_at", "2016-01-21 23:58:04.979225"]] 
    (2.1ms) commit transaction 
=> #<Dropdown id: 145, subject: nil, visible: nil, subject_value: nil, subject_description: nil, created_at: "2016-01-21 23:58:04", updated_at: "2016-01-21 23:58:04 

型號文件

class Dropdown < ActiveRecord::Base 

    FIELDS = [ 
       :subject, 
       :visible, 
       :subject_value, 
       :subject_description 
      ] 

    attr_accessor(*FIELDS) 
    subjects = %w[math english spanish] 

    subjects.each do |s| 
    scope s.to_sym, -> { where(subject: s) } 
    end 

end 

遷移文件

class CreateDropdowns < ActiveRecord::Migration 
    def change 
    create_table :dropdowns do |t| 
     t.string :subject 
     t.boolean :visible 
     t.string :subject_value 
     t.string :subject_description 

     t.timestamps null: false 
    end 
    end 
end 
+2

你可能不希望'attr_accessor(* FIELDS)'在你的模型中,你正在尋找ActiveRecord的憤怒 – bjhaid

+2

見https://stackoverflow.com/questions/4700785/using-attr-accessor-and- attr-accessible-on-the-same-field#answer-4735726 and https://stackoverflow.com/questions/2793098/usage-of-attr-accessor-in-rails – bjhaid

回答

2

你通過聲明attr_accessor重寫你的ActiveRecord::Base功能:

#app/models/dropdown.rb 
class Dropdown < ActiveRecord::Base 

    subjects = %w(math english spanish) 

    subjects.each do |s| 
    scope s.to_sym, -> { where(subject: s) } 
    end 

end 
  1. 你並不需要聲明FIELDS - 你可以調用@model.attributes (instance) or Model.column_names (class)來獲取該模型的所有領域。

  2. attr_accessor在班級中創建一組getter/setter methods。這會覆蓋你可能從你的數據庫中獲得的任何屬性,這就是爲什麼當你保存時你會得到nil條目。 Good ref here

-

以上型號應該爲你工作。

-1

這是沒有必要使用attr_accessor如果這些字段在數據庫表中的列。 ActiveRecord爲你做到了。請使用attr_accessible而不是attr_accessor。但對於軌道4+,沒有必要使用它。請參閱http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods/attr_accessible

此方法已棄用,或移動至最新的穩定版本。此處顯示 上一個現有版本(v3.2.13)。

+0

如何使用'attr_accessible'的建議'ruby-on-rails-4'標籤的問題會得到滿意的結果嗎? –

+0

這並沒有回答這個問題,從我發佈的鏈接中得到一個答案,但不理解後果 – bjhaid

+0

糟糕,我的錯,只是通過ruby-on-rail標籤進行過濾 –