I’m trying to do the following in my Rails 3 model:
require 'securerandom'
class Contest < ActiveRecord::Base
attr_accessor :key
before_create :generate_key
private
def generate_key
self.key = SecureRandom.hex(3)
end
end
However when I create a Contest, all the fields in my table appear to be correct except the key which remains nil in my DB.
More Info:
In my rails server log, I see the following when I create a contest through my “create contest form”
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]]
Note the [“key”, nil]
But that should be correct right?, I would guess that the key will be added by the Contest.rb :before_create callback?
Maybe I’m miss-using SecureRandom?
Why are you using
attr_accessor? This method is actually going to be defining both a setter and getter method for a key, keeping track of a virtual attribute.Perhaps you meant to use
attr_accessible, but even then that is unnecessary, because you’re setting the attribute directly.Really, you don’t need either
attr_accessor :keyorattr_accessible :keyin your model at all if you’re just setting it like this. Remove theattr_accessorand it will work.