Rails:before_create回调不适合我的模型

时间:2012-02-15 19:09:06

标签: ruby-on-rails ruby-on-rails-3 callback

我试图在我的Rails 3模型中执行以下操作:

require 'securerandom'

class Contest < ActiveRecord::Base
  attr_accessor :key
  before_create :generate_key

  private

  def generate_key
    self.key = SecureRandom.hex(3)
  end

end

然而,当我创建一个比赛时,我的表中的所有字段看起来都是正确的,除了在我的数据库中保持为零的键。

更多信息:

在我的rails服务器日志中,当我通过我的&#34;创建比赛表单&#34;

创建比赛时,我看到以下内容:
SQL (0.5ms)  INSERT INTO "contests" ("category", "created_at", "description", "key", "price", "status", "time", "title", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)  [["category", "camisas"], ["created_at", Wed, 15 Feb 2012 18:57:16 UTC +00:00], ["description", "test_description"], ["key", nil], ["price", 111], ["status", "In process"], ["time", "2sem"], ["title", "test_contest"], ["updated_at", Wed, 15 Feb 2012 18:57:16 UTC +00:00], ["user_id", 5]]

注意[&#34; key&#34;,nil]

但那应该是正确的吗?我猜这个密钥会被Contest.rb添加:before_create回调?

也许我错过了使用SecureRandom?

2 个答案:

答案 0 :(得分:3)

您为什么使用attr_accessor?这个方法实际上是为键定义setter和getter方法,跟踪虚拟属性。

也许您打算使用attr_accessible,但即便如此,这也是不必要的,因为您直接设置了该属性。

实际上,如果你只是像这样设置,你根本不需要模型中的attr_accessor :keyattr_accessible :key。删除attr_accessor即可。

答案 1 :(得分:0)

我认为你应该写attr_accessible <list accessible params>例如:

attr_accessible :key, :category