rails form - 2 поля с одинаковым идентификатором в форме - как отключить второе поле при выборе первого поля - PullRequest
0 голосов
/ 02 июня 2011

У меня в рельсах есть следующий код:

<label>Fruit: </label>  <%= f.select(:IST_FRUIT, [['Apple', 'Apple'],
                          ['Orange', 'Orange'],
                          ['Kiwi', 'Kiwi'],
                          ['Other', 'Other']
                          ],{ :prompt => "Please select"},{:onchange => "if (this.value == 'Other') 
                                                                         {document.getElementById('otherTissue').style.display = 'block';
                                                                         } "}
                          ) %>

<span id="otherFruit" style="display:none;"> If other, please state: <%= f.text_field :IST_FRUIT, :size => 10  %></span>

Пользователь может выбрать фрукт из списка, но если пользователь выбирает «Другое», отображается текстовое поле, позволяющее пользователю ввести его значение.

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

Буду очень признателен, если кто-нибудь подскажет, как отключить второе поле, когда «другое» не выбрано, и включить его, если в выпадающем списке выбрано «Другое».

Большое спасибо за любые предложения.

Ответы [ 2 ]

1 голос
/ 02 июня 2011

У меня есть еще один совет.Вместо отключения ввода HTML (кстати, идентификатор должен быть уникальным в документе HTML), просто создайте другой атрибут в вашей модели, назовите его, например, «other_fruit», и используйте это значение, если «fruit» установлен в «другой или пуст.Например, вы можете написать что-то вроде этого:

class TheModel
  attr :other_fruit

  # Overwritten accessor for the fruit attribute.
  # Returns the values of :other_fruit if :fruit is blank.
  #
  def fruit
    if self[:fruit].blank?
      other_fruit
    else
      self[:fruit]
    end
  end
end

Теперь часть HTML.В вашем JavaScript вы устанавливаете «display» для блокировки, но не сбрасываете его, когда пользователь выбирает другую опцию.

Если вы хотите запретить отправку поля на сервер, вы должны установить «disabled»приписывать.Установка «стиля» скрывает управление только от глаз пользователя.

1 голос
/ 02 июня 2011

Во-первых, имейте в виду, что сообщения рельсов основаны на имени полей, а не на их идентификаторах.

В вашем случае вы должны использовать virtual attribute для хранения потенциального значения other fruit.

Ваша модель может выглядеть так:

attr_accessor :other_fruit

before_save :check_fruits

def check_fruits
  #if other_fruit is not nil, it means that you want to store it's value in you IST_FRUIT column 
  #BTW, why these capital letters?
  IST_FRUIT = other_fruit unless other_fruit.nil?
end

А ваша форма будет выглядеть так:

<span id="otherFruit" style="display:none;"> If other, please state: <%= f.text_field :other_fruit, :size => 10  %></span>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...