Проблема формы рельсов

Имейте логическое поле (с использованием formtastic), и значение не будет сохраняться из-за ошибки. Если отправлено и существует ошибка, при перезагрузке логическое поле автоматически проверяет себя, что плохо. Я вижу, что проблема заключается в конфликтующем значении, скрытое равно 0, тогда как входное значение равно 1. Оба должны быть 0. Как мне исправить это, чтобы оба изначально были установлены на 0. Где я ошибаюсь?

Код формы:

<%= f.input :legal, :as => :boolean %>

Сгенерированный HTML-код

<li class="boolean optional" id="user_legal_input">
   <input name="user[legal]" type="hidden" value="0" />
   <label for="user_legal">
      <input id="user_legal" name="user[legal]" type="checkbox" value="1" />I Agree to the legal terms
   </label>
</li>

ДОБАВЛЕНО: Пользовательский (Создать) Контроллер

def create
    @user = User.new(params[:user])
    respond_to do |format|
      if @user.save
        format.js  
      else
        format.js  
      end  
    end
  end

JS просто перерисовывает форму со всеми встроенными ошибками.


person John    schedule 24.05.2011    source источник
comment
Опубликуйте соответствующий код действия контроллера (создать/обновить), пожалуйста   -  person Max Williams    schedule 24.05.2011
comment
Если в вашей модели (user.rb) есть раздел attr_accessible, убедитесь, что вы добавили :legal в список.   -  person John Gibb    schedule 24.05.2011
comment
@Джон Гибб, это так. Проблема в том, что начальные значения конфликтуют   -  person John    schedule 24.05.2011


Ответы (1)


для скрытого поля всегда установлено значение «0», чтобы имитировать снятый флажок, это правильное поведение: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box

Вместо этого я предлагаю, чтобы ваша проблема была вашим методом доступа в модели.

Ввод флажка проверяется, если @user.legal имеет тип true, или, точнее, если

ActionView::Helpers::InstanceTag.check_box_checked?(@user.legal,"1")

оценивает как истинное.

Теперь, если legal является логическим столбцом базы данных, инициализатор rails преобразует его в ruby ​​boolean, поэтому, если вы это сделаете

@user = User.new(:legal => "0")

тогда

@user.legal == false

но если legal не является столбцом db (иначе :as => :boolean не нужен), то вы должны каким-то образом определить метод доступа.

Если вы сделали это с помощью простого attr_accessor, то

@user.legal == "0"

который правильно оценивается как неотмеченный флажок.

но если вы или ваша структура хотите перехитрить рельсы, и вы определяете:

attr_writer :legal
def legal
 !!@legal
end

или что-то подобное под капотом (чтобы дать вам правильное логическое значение), то у вас проблемы:

Здесь начальное отображение формы !!nil равно false => флажок снят. но при отправке/перезагрузке !!"0" верно => установлен флажок.

подскажите, верна ли моя догадка :)

person Viktor Trón    schedule 26.05.2011
comment
Думал, что это сработало, но это не так. :legal не является столбцом базы данных, он был атрибутом attr_ccessible, что было частью проблемы. Не могу понять, как определить его как метод доступа - person John; 26.05.2011
comment
Джон, какой ORM ты используешь? АктивРекорд? как вы определили законный метод доступа? Вы делаете какие-либо преобразования по его заданию? - person Viktor Trón; 27.05.2011
comment
Спасибо за помощь, но я решил последовать вашему простому совету и просто добавить столбец базы данных с именем legal. - person John; 30.05.2011