2011-01-15 1 views

ответ

4

Спасибо всем за быстрые ответы! Ваши ответы в совокупности дали мне те части, которые мне нужны, чтобы понять эту загадку, я думаю.

(В связи с этим у меня было много нулевых ошибок, таких как «Объект не поддерживает #inspect» и «undefined method» keys для nil: NilClass ». Мне удалось решить это сейчас, . удаление поля att_accessor в целом)

экспериментируя с данным случаем, это то, что я узнал:

на самом деле,: имя поле не будет сохраняться в базу данных.

user = User.new(:name=>"somename") 

Устанавливает только атрибут объекта, но не сохраняет столбец: name в базе данных. Как и следующие "рельсы консольного вывода показывает:

> 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 перекроет сеттер ActiveRecord в * (который заботится о сохранении базы данных). Вы все еще можете получить значение из: имя поля от объекта, хотя, как это:

> user.name 
=> "somename" 

Итак, в заключение, я узнал, что использование attr_accessor на полях может привести к ним не сохраняется в базе данных ,И хотя я думал, что attr_accessible описывает поля в базе данных, которые должны быть доступны снаружи, в этом случае, похоже, не имеет значения.

1

Поскольку он наследует ActiveRecord, он будет сохранен, когда вы вызываете метод save (но не при его создании).

Если у вас нет атрибутов для этой модели, я полагаю, что ActiveRecord просто сохранит новую строку в базе данных (т. Е. Ваш объект будет иметь только постоянный id). Это имеет смысл, так как впоследствии вы можете добавить атрибуты к своей модели User, а сохранившиеся экземпляры все равно должны быть восстановлены.

5

В большинстве случаев вам не нужно использовать attr_accessor, если это поле является столбцом в таблице users в вашей базе данных. ActiveRecord выяснит это для вас.

attr_accessible просто позволяет назначать поле через массовое присвоение (например, update_attributes). Это хорошо для безопасности. Дополнительная информация от MassAssignmentSecurity API docs.

70

attr_accessor является рубиновым кодом и используется, когда у вас нет столбца в базе данных, но все же хотите показать поле в ваших формах. Единственный способ разрешить это - attr_accessor :fieldname, и вы можете использовать это поле в своем представлении или модели, если хотите, но в основном в своем представлении.

attr_accessible позволяет вам перечислять все столбцы, которые вы хотите разрешить массовое присвоение, так как анди избегала выше. Противоположностью этому является attr_protected, что означает это поле. Я НЕ хочу, чтобы кому-то разрешалось назначать Mass Assign. Скорее всего, это будет поле в вашей базе данных, в котором вы не хотите, чтобы кто-нибудь обезвредил. Как поле статуса или тому подобное.

+1

Единственный лучший ответ Я видел этот важный и важный вопрос. По какой-то причине это обычно не выдается людям. Благодарю. – Ethan

+1

Это очень хорошее объяснение различий между ними, но это не вопрос: что происходит, когда вы используете их как в одном поле (или что происходит с упорством). Для этого, мой мой итоговый ответ ниже. – Magne