Использование attr_accessor и attr_accessible в одном поле

Что происходит в фоновом режиме со следующим кодом?

class User < ActiveRecord::Base

 attr_accessor :name
 attr_accessible :name

end

Подсказка: при создании экземпляра класса он будет сохранен в базе данных? Почему или почему нет?

4 ответа

Решение

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

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

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

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

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

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

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

> user.name
=> "somename"

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

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

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

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

attr_accessible просто позволяет назначить поле с помощью массового назначения (например, с update_attributes). Это хорошо в целях безопасности. Более подробная информация в документах API MassAssignmentSecurity.

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

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

Другие вопросы по тегам