Rails:使用attr_accessor分配非数据库值时遇到问题

时间:2012-12-12 22:34:43

标签: ruby-on-rails attr-accessor

我在Rails 3中创建了一个用户模型。我正在尝试从表单创建一个新模型。

表单有一个:密码字段

<%= f.label(:password) %>
<%= f.password_field(:password) %>

但模型包含属性:hashed_pa​​ssword。

models / user.rb文件包含在将模型保存到数据库之前采用:password并将其编码为:hashed_pa​​ssword的逻辑。

#models/user.rb

require 'digest/sha1'

class User < ActiveRecord::Base

    attr_accessible :password, :email, :first_name, :last_name

    attr_accessor :password

    before_save :create_hashed_password


    #hash_password adds salt to password and encrypts it

    def self.hash_password(password="")
        salted_pw = password + PW_SALT
        hashed_pw = Digest::SHA1.hexdigest(salted_pw)       
     end

 private

     def create_hashed_password
         unless password.blank?
             self.hashed_password = User.hash_password(password)
         end
     end

end

我认为应该能够分配:password属性,因为我在用户模型文件中使用了attr_accessor:password。

有趣的是,我可以在控制器中使用质量赋值为:password分配一个值:

#from controllers/users_controller.rb   

 def create
     @user = User.new(params[:user])

     ...

 end

但我无法从rails控制台明确指定myUser.password。

>> myUser = User.new
=> #<User id: nil, first_name: nil, last_name: nil, hashed_password: nil,  cell_phone_number: nil, email: "", created_at: nil, updated_at: nil, salt: nil, is_admin: false>
>> myUser.password = "mypw"
NoMethodError: undefined method `password=' for #<User:0x10232cd70>
from /Library/Ruby/Gems/1.8/gems/activemodel-3.2.8/lib/active_model/attribute_methods.rb:407:in `method_missing'
from /Library/Ruby/Gems/1.8/gems/activerecord-3.2.8/lib/active_record/attribute_methods.rb:149:in `method_missing'
from (irb):74
from :0

有谁知道为什么会这样?

提前致谢!

0 个答案:

没有答案