2012-02-13 89 views
1

这是user.rb:功能,但实际上没有可用

# == Schema Information 
# 
# Table name: users 
# 
# id   :integer   not null, primary key 
# name  :string(255) 
# email  :string(255) 
# created_at :datetime  not null 
# updated_at :datetime  not null 

class User < ActiveRecord::Base  
    attr_accessible :name, :email, :password, :password_confirmation, :remember_token 
    has_secure_password 
    before_save :create_remember_token 

    validates :name, presence: true, :length => { maximum: 50 } 
    valid_email_regex = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, :presence => true, 
        :format  => { with: valid_email_regex }, 
        :uniqueness => { case_sensitive: false } 

    validates :password, length: { minimum: 6} 

    private 

    def create_remember_token 
     self.remember_token = SecureRandom.urlsafe_base64 
    end 
end 

我已经定义了功能create_remember_token,但我注意到,在这个文件中,我不能把它。在Rails的控制台中,它也没有工作:

1.9.2-p290 :002 > User.first.create_remember_token 
    User Load (0.4ms) SELECT "users".* FROM "users" LIMIT 1 
NoMethodError: private method `create_remember_token' called for #<User:0x0000010289cda0> 
    from /Users/luke/.rvm/gems/ruby-1.9.2-p290/gems/activemodel-3.2.0/lib/active_model/attribute_methods.rb:404:in `method_missing' 
    from /Users/luke/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.0/lib/active_record/attribute_methods.rb:129:in `method_missing' 
    from (irb):2 
    from /Users/luke/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.0/lib/rails/commands/console.rb:47:in `start' 
    from /Users/luke/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.0/lib/rails/commands/console.rb:8:in `start' 
    from /Users/luke/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.0/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main> 

我在做什么错?

+0

您尝试调用的方法是私有方法,因此您无法在创建的类之外调用它。解决这个问题的方法是从您定义方法的类中删除private关键字(User.rb) – mohamagdy 2012-02-13 09:17:10

+0

请问您为什么更改了接受的答案?只是好奇... – Mischa 2013-09-17 07:40:52

回答

1

注意到你得到的错误:NoMethodError: private method。将方法移至private以上,您就可以访问它。

0

您只能在班级本身中调用私人方法,而不能从班级以外调用。将你的方法上面private

def create_remember_token 
    self.remember_token = SecureRandom.urlsafe_base64 
end 

private 

# Your private methods here 
0

如果您的问题是在控制台中调用此方法,那么是从私有中删除它将解决问题。但是,我想你一定要保持这种方法的私密性。还有其他一些潜在的问题吗?失败的测试?该方法应该正常工作。

相关问题