Rails创建方法导致记录为空。
Rails创建方法导致记录为空。
为什么这个创建方法会生成一个空的记录?
我尝试过:
Dropdown.create(subject: "test")
Dropdown.create({subject: "test", subject_value: "1"})
Dropdown.create({:subject => "test", :subject_value => "1"})
所有的结果都是空记录。
(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 => #
模型文件
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
Rails Create方法导致记录为空的问题是由于使用了attr_accessor而不是attr_accessible引起的。在Rails 4+中,不需要使用attr_accessible。解决方法是使用attr_accessible替代attr_accessor。
attr_accessor是用来定义一个属性的读写方法,但如果这些字段是数据库表的列,就不需要使用它。ActiveRecord会自动为你完成这个工作。
attr_accessible是用来定义可访问的属性列表,它可以限制哪些属性可以进行批量赋值。但是在Rails 4+中,attr_accessible已被废弃,不再需要使用它。
可以参考以下链接获取更多信息:http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods/attr_accessible
在解决问题的过程中,有人建议在ruby-on-rails-4标签的问题中使用attr_accessible,但这个建议并没有回答问题,只是从我发布的链接中抄袭答案而已。
对不起,这是我的错误,只需按ruby-on-rail标签进行过滤。