2012-02-13 4 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

+0

Могу ли я спросить, почему вы изменили принятый ответ? Просто любопытно... – Mischa

ответ

1

Уведомление об ошибке вы получаете: NoMethodError: private method. Переместите метод выше private, и вы сможете получить к нему доступ.

0

Вы можете вызвать частные методы только в самом классе, а не вне класса. Переместить ваш метод выше private:

def create_remember_token 
    self.remember_token = SecureRandom.urlsafe_base64 
end 

private 

# Your private methods here 
0

Если ваша проблема вызывает этот метод в консоли, тогда да, удалив его из частного, вы решите проблему. Но, я думаю, вы определенно хотите сохранить этот метод частным. Есть ли еще одна проблема? Неудачный тест? Метод должен работать нормально, как написано.

Смежные вопросы