Rails创建方法导致记录为空。

18 浏览
0 Comments

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

0
0 Comments

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标签进行过滤。

0
0 Comments

问题出现的原因是在Dropdown模型中使用了attr_accessor方法,它会创建一组getter和setter方法,这会覆盖从数据库中获取的属性,导致保存时出现nil的记录。

解决方法是去掉attr_accessor方法的调用。另外,不需要声明FIELDS,可以使用.attributes方法(实例方法)或Model.column_names方法(类方法)来获取模型的所有字段。以上的模型应该可以解决问题。

0