2013-05-21 5 views
1

Я иду, хотя учебник (который я должен сказать, это отличный ресурс), и я не совсем понимаю следующее:Rails Tutorial: 6.3.1 Зашифрованный пароль

В разделе 6.3.1 мы создать столбец password_digest в БД через создание и запуск сценария перенастройки с помощью:

rails generate migration add_password_digest_to_users password_digest:string 
bundle exec rake db:migrate 
bundle exec rake db:test:prepare 
bundle exec rspec spec/ 

Затем на консоли рельсы я в состоянии создать экземпляр объекта модели пользователя и установить на нем password_digest:

irb(main):007:0> @user = User.new 
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil,  password_digest: nil> 
irb(main):008:0> @user.password_digest = "zzzz" => "zzzz" 
irb(main):009:0> @user.password_digest => "zzzz" 

Однако я не могу видеть password_digest свойства на пользователь определении класса модели:

class User < ActiveRecord::Base 
    attr_accessible :email, :name 

    before_save { |user| user.email = email.downcase} 

    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 

    validates :name, presence: true, length: {maximum: 50} 
    validates :email, presence: true, format: { with: VALID_EMAIL_REGEX}, uniqueness: {case_sensitive: false} 
end 

Я представляю Rails делают некоторые магии под одеялом, что кто-то ум объясняя именно то, что он делает?

Спасибо!

+0

Это странно - вы можете присвоить значение атрибуту, не имеющему белого цвета. Обычно вам нужно добавить вызов 'devize' или, по крайней мере,' attr_accessible: password_digest' ... – shybovycha

+0

@shybovycha Не является attr_accessible для массового присваивания, что это не так? –

+0

'Однако я не могу увидеть свойство password_digest в определении класса модели User' Что вы смущаетесь? Вы ожидаете, что ссылка на новый столбец появится где-нибудь в модели? Потому что это не так, как это работает. –

ответ

0

Вот несколько способов, что класс может иметь переменную-член, что вы не можете видеть в определении класса:

class ActiveRecord 
    def password_digest=(val) 
    @x = val 
    end 
    def password_digest 
    @x 
    end 
end 


class User < ActiveRecord 
end 

me = User.new 
me.password_digest = "hello" 
puts me.password_digest #=> "hello" 

Created динамически во время выполнения:

class User 
end 

User.class_eval do 
    attr_accessor :password_digest 
end 

me = User.new 
me.password_digest = "hello" 
puts me.password_digest #=> "hello" 

Проблема I найденный с помощью руководства по рельсам:

1) It is extremely boring. 

2) Because all you do is copy code. 

Поздравляем с получением главы 6!

+0

Спасибо, но не уверен, что это очистит мое замешательство. 1) ваше описание наследования ... но свойство password_digest стало доступным только для объекта модели после того, как я добавил его в db через db migrate script. 2) Я не добавляю свойства во время выполнения, рельсы делают это для меня при запуске на основе того, что определено в db? –

+0

@YashikaLamahewa Да, это добавление методов к модели, основанной на том, что находится в БД. –

1

Вы правы - то, что на самом деле происходит здесь is рельсы магии за кулисами.

Всякий раз, когда у вас есть потомок ActiveRecord::Base, ActiveRecord будет искать таблицу базы данных для этого класса и автоматически создавать для вас аксессоры - они не будут отображаться в определении класса. Это кажется сумасшедшим, если вы исходите с такого языка, как C#, где раньше вы должны были делать подобные вещи вручную.

Что ActiveRecord делает (это очень разбавленные объяснение, реальная вещь, это делает гораздо более сложным) является своего рода торчит следующий код в вашем классе:

class User < ActiveRecord::Base 
    def password_digest 
    @password_digest 
    end 

    def password_digest=(val) 
    @password_digest = val 
    end 

end 

Другое дело обратите внимание, что он не просто создает для вас атрибут getter и setter - он смешивается в кастомном типе в зависимости от типа столбца. Обратитесь к this question за дополнительной информацией и некоторыми возможными ошибками.

Чистый результат этого на самом деле является бонусом, и одна из причин, по которым мне нравятся рельсы: вы определяете столбец один раз в своей базе данных, и вы получаете его в свой класс модели бесплатно.

Этот шаблон является общим для Rails, хотя, и вы увидите его часто. Если вы все еще изучаете структуру Ruby или Rails, и вы не на 100% уверены, откуда что-то приходит, не бойтесь смотреть пристально - так называемая магия Rails возникает часто, и требуется некоторое время, чтобы не быть удивлены.У меня был этот опыт, когда я впервые переехал в Rails с других языков.

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