В новой модели Rails выбрасывается неопределенная ошибка метода - PullRequest
1 голос
/ 07 декабря 2011

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

Я добавил новое поле 'is_ignored 'для модели, использующей миграцию;поле уже находится в базе данных mysql.Поле перечислено в schema.rb и помечено как attr_accessible в определении модели, но все равно выдает неопределенную ошибку метода, когда я пытаюсь присвоить значение.

Вот с чем я работаю.

Миграция (работает и заполняет поля, как и ожидалось):

  def self.up
    add_column :user, :is_ignored, :boolean

    User.reset_column_information
    User.find(:all).each do |p|
      p.update_attribute :is_ignored, false
    end

Схема (примечание "перейти к объявлению" в RM занимаетя здесь, как это было бы рабочие поля):

  create_table "users", :force => true do |t|
    ...
    t.datetime "updated_at"
    t.boolean  "is_ignored"
  end

Контроллер:

  params[:selected_users].each do |id|
    @user = User.find(id)
    @user.is_ignored = false #here is where the error is being thrown
    @user.save
  end

Я потратил много времени на контроллер до сих пор и не хотел бы сдуть его и повторноЛеса, если мне не обязательно.Есть ли какой-то другой шаг в ручном добавлении нового поля в модель, которую я мог пропустить?

Редактировать:

Я также подтвердил, что могу получить доступ к этому полюи установите значение из консоли rails, и что @user не равен nil в моем контроллере при выполнении вызова;все же он все еще выдает эту ошибку undefined_method.

Second Edit:

Так что это довольно круто;друг предложил заменить этот вызов метода следующим образом:

@user.update_attribute( :is_ignored, false )

Что мы ожидали, но сработало!Он выдал ту же неопределенную ошибку метода, что и раньше ...

Ответы [ 3 ]

1 голос
/ 07 декабря 2011

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

<td><%= check_box_tag "selected_users[#{ignored_user.id}]" %></td>

Что я не знал об этом, так это то, что помещение чего-либо в квадратные скобки не создает массив этого объекта, как я ожидал, но создает хэш значений флажков, введенных в ключ объектом, помещенным в квадратные скобки. Таким образом, когда меня оперировал контроллер, я передавал хеш:

{'42'=>'1'}

Изменение моего кода для передачи второго параметра в блок do разделило этот хеш и позволило мне работать с идентификатором выбранного пользователя:

params[:selected_users].each do |id,value|
  @user = User.find(id)
  @user.is_ignored = false #here is where the error is being thrown
  @user.save
end
0 голосов
/ 07 декабря 2011

User или UserFacebookFriend?- мне кажется, это разные модели.Вы только добавили столбец к User

0 голосов
/ 07 декабря 2011

Вам не нужно добавлять поле в attr_accessible, поскольку оно является полем с колонкой (активная запись сможет работать с полем без дополнительного кода). Вы пытались перезапустить сервер разработки (перезапустить 'rails server')?

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