Проверка наличия поля не выполняется, даже если поле не пустое - PullRequest
1 голос
/ 05 августа 2011

Я пытаюсь заполнить массив значениями из флажков.Он работает просто отлично при создании записи, но не проходит проверку при редактировании.Параметры выглядят правильно, что меня действительно смущает:

"record"=>{... "type_array"=>["accounting"], ...}

Выглядит так же, как параметры при создании новой записи.Поля в New.html.erb и Edit.html.erb также используют ту же разметку.

Edit.html.erb

<div class="field">
  <%= f.label :type_array, "What type of record?" %><br />
  <% ["accounting", "agriculture", "automotive"].each do |type| %>
    <%= check_box_tag 'record[type_array][]', type, (true if @record.type_list.include? type),
                      :id => type %>
    <%= label_tag type, type.titleize, :class => type %><br />
  <% end %>
</div>

Части Record.rb

validates :type_array, :presence => true
attr_accessor :type_array
attr_accessible :type_array
before_validation :set_type_list

private

def set_type_list
  self.type_list = type_array.join ',' if type_array.present?
end

Я что-то упустил?Когда я удаляю проверку type_array и заполняю форму, она действует так, как будто type_array пуст.Где-то вдоль линии, это должно быть потеряно или что-то в этом роде.

Я ценю любую помощь.

(Sidenote: если у кого-то есть лучший способ сделать список флажков, дайте мне знать)

1 Ответ

5 голосов
/ 05 августа 2011

Удалить строку attr_accessor :type_array.

Это создает методы доступа для новой переменной экземпляра, а не для атрибута модели type_array, что означает, что @record.type_array теперь ссылается на эту переменную экземпляра вместоатрибут.

Вы почти никогда не используете attr_accessor или его братьев и сестер attr_reader и attr_writer в Rails, потому что вы хотите иметь дело с атрибутами модели, а не переменными экземпляра.

Редактировать: Вы используете type_array в качестве виртуального атрибута.

class Record < ActiveRecord::Base
  validates :type_array, :presence => true
  attr_accessible :type_array

  def type_array=(val)
    self.type_list = val.join ','
  end

  def type_array
    self.type_list.split ','
  end

  def type_array_before_type_cast
    type_array
  end
end

Для получения информации о последнем определении функции см. этот вопрос .

...