2012-05-30 2 views
0

У меня есть форма, которую нужно изменить, основываясь на разных вариантах в поле выбора. Поле выбора, которое мне нужно, имеет следующие параметры: Pay & Подарки (оба поля показаны), Pay Only (отображается только поле для оплаты), Подарки Только (показано только подарочное поле).Rails 3: как изменить форму с помощью поля выбора?

Это включает в себя 2 атрибута: pay and: gifts. Есть ли способ иметь один поле выбора f.collection для обоих атрибутов? Я знаю, что мне, вероятно, придется использовать jquery, чтобы показывать и скрывать поля формы, а поля обязательны (validates_presence_of) на основе выбора ... любые предложения о том, как это сделать?

_rewards_step.html.erb

<h2>rewards</h2> 

    <p> 
<%= f.collection_select :pay, Upload::REWARDS, :to_s, :to_s %> 
    </p> 
    <p id="payfields"> 
    <%= f.label :pay %><br /> 
    <%= f.text_field :pay %> 
    </p> 
    <p id="giftsfields"> 
    <%= f.label :gifts %><br /> 
    <%= f.text_field :gifts %> 
    </p> 

upload.rb

class Upload < ActiveRecord::Base 
attr_accessible :pay, :gifts 
attr_writer :current_step 

validates_presence_of :pay, :if => lambda { |u| u.current_step == "rewards" } 
validates_presence_of :gifts, :if => lambda { |u| u.current_step == "rewards" } 

REWARDS = ['Pay & Gifts', 'Pay Only', 'Gifts Only'] 

ответ

1

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

JQuery часть, чтобы скрыть поля:

$("#rewards").change(function(){ 
    if ($("#rewards").val()=="Pay Only") {$("#gift_field").hide(); $("#pay_field").show(); } 
    if ($("#rewards").val()=="Gift Only") {$("#gift_field").show(); $("#pay_field").hide(); } 
    if ($("#rewards").val()=="Pay & Gift") {$("#gift_field").show(); $("#pay_field").show(); } 
}) 

Конечно, вам нужно настроить идентификаторы и значения кода.

Валидация часть может быть обманут с :if

attr_accessor :reward_type 
validates_presence_of :pay, :if => lambda { |u| u.current_step == "rewards" && reward_type != "Gift Only" } 
validates_presence_of :gifts, :if => lambda { |u| u.current_step == "rewards" && reward_type != "Pay Only" } 

Это просто скелет решения, думать об этом.

+0

спасибо за информацию ... У меня возникла проблема с назначением идентификатора в поле выбора. это то, что у меня есть: <% = f.collection_select: reward_type, Upload :: REWARDS,: to_s,: to_s,: id => "rewards"%>. Что-то не так с этой линией? – user1341808

+0

Да, есть, ваш идентификатор используется как опция для выбора, а не как вариант HTML. Попробуйте это: '<% = f.collection_select: reward_type, Upload :: REWARDS,: to_s,: to_s, {}, {: id =>" rewards "}%>' – Matzi

+0

woohoo! это работает – user1341808

0

Хм, вообще говоря, вы правы, вы должны использовать JavaScript для обновления DOM на основе на выбор в поле выбора. Вы можете привязываться к событию «change» в самом окне select. Что-то вроде:

$('select#my_select_box_id').change(function(){ 
    //take a decision based on $(this).val() 
    $('p#giftsfield').show() //or hide based on what you want 
}) 

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

+0

Вы бы рекомендовали создать отдельный атрибут для окна выбора? – user1341808

+0

Определенно. То, что ниже выглядит хорошо. Хотя я думаю, что в этом нет необходимости передавать: to_s symbol to collection_select. – Renra

Смежные вопросы