Что происходит в фоновом режиме со следующим кодом?
class User < ActiveRecord::Base
attr_accessor :name
attr_accessible :name
end
Подсказка: при создании экземпляра класса он будет сохраняться в базе данных? Почему или почему нет?
Что происходит в фоновом режиме со следующим кодом?
class User < ActiveRecord::Base
attr_accessor :name
attr_accessible :name
end
Подсказка: при создании экземпляра класса он будет сохраняться в базе данных? Почему или почему нет?
Спасибо всем за быстрые ответы! Я думаю, что ваши ответы в совокупности дали мне те части, которые мне нужны, чтобы понять эту загадку.
(В связанной проблеме я получал много нулевых ошибок, таких как "Object does not support #inspect" и "undefined method" для nil: NilClass ". Мне удалось решить это сейчас, удалив att_accessor).
Экспериментируя с этим конкретным случаем, это то, что я узнал:
Собственно, поле: name не будет сохраняться в базе данных.
user = User.new(:name=>"somename")
Устанавливает атрибут только для объекта, но не сохраняет столбец: name в базе данных. Как и в следующем окне "rails console", вы увидите:
> user
=> <User id: nil, created_at: nil, updated_at: nil>
> user.save
=> true
> user
=> <User id:1, created_at: 2011-01-19 12:37:21, updated_at: 2011-01-19 12:37:21>
Я предполагаю, что это связано с тем, что * сеттер, созданный attr_accessor, переопределит setRecord для ActiveRecord * (который заботится о сохранении базы данных). Вы все равно можете извлечь значение из поля: name из объекта, например:
> user.name
=> "somename"
Итак, в заключение я узнал, что использование attr_accessor в полях может привести к тому, что они не будут сохраняться в базе данных. И хотя я думал, что attr_accessible описывает поля в базе данных, которые должны быть доступны снаружи, в этом случае это не имеет никакого значения.
attr_accessor - это код ruby и используется, когда у вас нет столбца в вашей базе данных, но все же хотите показать поле в ваших формах. Единственный способ разрешить это - attr_accessor :fieldname
, и вы можете использовать это поле в своем представлении или модели, если хотите, но чаще всего в вашем представлении.
attr_accessible позволяет вам перечислить все столбцы, которые вы хотите разрешить Массовое присвоение, так как они не ускользнули выше. Противоположностью этому является attr_protected, что означает это поле. Я НЕ хочу, чтобы кому-то разрешалось назначать Mass Assign. Скорее всего, это будет поле в вашей базе данных, в котором вы не хотите, чтобы кто-нибудь обезвредил. Как поле статуса или тому подобное.
В большинстве случаев вам не нужно использовать attr_accessor
, если поле является столбцом в таблице users
в вашей базе данных. ActiveRecord выяснит это для вас.
attr_accessible
просто позволяет назначить поле через массовое присвоение (например, с помощью update_attributes
). Это хорошо для безопасности. Дополнительная информация из Документы API MassAssignmentSecurity.
Так как он наследует ActiveRecord
, он будет сохраняться при вызове метода save
(но не при его создании).
Если у вас нет атрибутов для этой модели, я предполагаю, что ActiveRecord
просто сохранит новую строку в базе данных (т.е. ваш объект будет иметь только сохраненный id
). Это имеет смысл, так как позже вы можете добавлять атрибуты к вашей модели User
, а сохраняемые экземпляры все равно должны быть восстановлены.