rails Model.create (: attr => "value") возвращает модель с неинициализированными полями - PullRequest
0 голосов
/ 28 февраля 2011

Это действительно ставит меня в тупик. Процесс работает нормально, если я использую #new, а затем #save, но #create возвращает экземпляр модели со всеми полями, установленными на nil.

например: Неожиданное поведение:

ruby-1.9.2-p0 > EmailDefault.create(:description=>"hi")
 => #<EmailDefault id: nil, description: nil, created_at: nil, updated_at: nil> 

Ожидаемое поведение:

ruby-1.9.2-p0 > e = EmailDefault.new
 => #<EmailDefault id: nil, description: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p0 > e.description = "hi"
 => "hi"
ruby-1.9.2-p0 > e.save
 => true 
ruby-1.9.2-p0 > EmailDefault.last
 => #<EmailDefault id: 4, description: "hi", created_at: "2011-02-27 22:25:33", updated_at: "2011-02-27 22:25:33"> 

Что я делаю не так?

- update-- Оказывается, я неправильно использовал attr_accessor. Я хотел добавить некоторые атрибуты, не связанные с базой данных, поэтому я сделал это с помощью:

attr_accessible :example_to, :cc_comments

, что неправильно, и вызвало ситуацию, упомянутую @Heikki. Что мне нужно сделать, это:

attr_accessor :example_to, :cc_comments

1 Ответ

1 голос
/ 28 февраля 2011

Чтобы включить массовое назначение, вам нужно внести в белый список эти свойства с помощью attr_accessible.

http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html#method-i-attr_accessible

- edit

По умолчанию все атрибуты доступны для массы-assignment.Если используется attr_accessible, массовое назначение будет работать только для этих атрибутов.Attr_protected работает противоположным образом, т.е.эти атрибуты будут защищены от массового назначения.Только один должен использоваться одновременно.Я предпочитаю белый список с attr_accessible.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...