Как я могу получить набор радиокнопок для принятия NULL (ничего не проверено)? - PullRequest
2 голосов
/ 23 марта 2010

Я работаю над приложением Rails, где у меня есть набор из двух переключателей, где пользователи могут нажимать «да» или «нет». Столбец MySQL DB, созданный миграцией ActiveRecord, - это tinyint.

Если пользователь не нажимает ни одну из переключателей, я хочу, чтобы MySQL сохранил NULL. (Столбец допускает NULL.) И когда они возвращаются для редактирования данных, ни одна кнопка не должна быть проверена.

Происходит то, что ActiveRecord хранит 0, а затем, когда я возвращаюсь, проверяется кнопка «Нет».

Рельсы 2.3.5

Код формы (я использую Haml):

        = f.radio_button( :model_attribute, true )
        Yes

        = f.radio_button( :model_attribute, false )
        No

(Оглядываясь назад, возможно, было бы лучше использовать один флажок, но сейчас было бы трудно изменить это.)

Ответы [ 7 ]

3 голосов
/ 23 марта 2010

Я столкнулся с такой проблемой в ASP.NET MVC. Поскольку null по сути является третьим возможным состоянием, я добавил третью скрытую радиокнопку, которая выбрана по умолчанию. Когда мой ответ содержал «нулевой» ответ переключателя, я установил его вручную. Я не уверен, что это именно то, к чему вы стремитесь или нет, но это хорошо сработало для моей ситуации.

2 голосов
/ 30 августа 2013

Вот мой дубль. Я хочу, чтобы пользователь мог отменить выбор true / false и установить атрибут равным nil (Rails 4):

форма

= f.radio_button :accepted, true
= f.radio_button :accepted, false
= f.radio_button :accepted, 'nil'

Контроллер

def widget_params
  if params[:widget][:accepted] == 'nil'
    params[:widget][:accepted] = nil
  end
  params.require(:widget).permit(:accepted)
end
2 голосов
/ 23 марта 2010

Это, кажется, опровергает идею переключателей (то есть, выбирайте одну из набора). Если важно отследить «нет ответа», можно ли добавить третью кнопку-переключатель для этой опции? Если вы не хотите, чтобы пользователь выбирал ответ, а затем повторно выбирал «нет ответа», вы можете выборочно отображать кнопку в форме на основе ее текущего значения.

1 голос
/ 13 февраля 2013

Я решил это сегодня в следующем (упрощенном) примере. Это не идеально, но мне кажется, что это работает :) Должен быть более простой способ обойти Rails, не отправляя через параметр радиокнопки, для которых не выбрано значение ...

В контроллере:

def create
  params[:post] = Post.deselect_radio_buttons(params[:post])
  @post = Post.new(params[:post])

  if @post.save
    redirect_to post_path(@post), notice: 'Post created'
  else
    render action: :new
  end
end

в модели:

# Define the fields that are used as radio buttons in the form.
RADIO_BUTTONS = [:field1, :field2]

def self.deselect_radio_buttons(params)
  RADIO_BUTTONS.each do |field|
    if params[field].blank?
      params[field] = nil
    end
  end

  return params
end
1 голос
/ 24 марта 2010

Судя по вашему ответу на мой комментарий, это поведение, которое вам нужно, поэтому это не проблема пользовательского интерфейса, а проблема вашей модели. Мне кажется, что вызов YourModel.create () создаст запись в БД с 0 в столбце.

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

class YourModel
  def initialize
    self.model_attribute = nil
  end
end

Однако, если вы действительно хотите 3 варианта: Да, Нет или Не установлен, то вам, вероятно, следует просто изменить model_attribute с логического значения на «enum», где 0 означает «Не установлено», 1 означает «Да», а 2 означает «Нет» ».

1 голос
/ 24 марта 2010

Я только что проверил это сам, и он просто работает, как вы хотите. Вы уверены, что в вашем действии обновления или вашей модели нет кода, который изменяет атрибут? Если в вашей форме не выбрано радио, хэш params не будет иметь значения для этого атрибута, и запись сохранит свое предыдущее значение. Проверьте вашу модель на наличие метода записи атрибута или методов обратного вызова.

1 голос
/ 23 марта 2010

Как насчет добавления :default => null к миграции ActiveRecord для столбца?

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