Проблемы с повторным заполнением опций выбора в Rails, когда форма возвращается с ошибками - PullRequest
1 голос
/ 13 мая 2009

У меня есть форма с двумя вариантами выбора - частота и продолжительность. Если в форме есть ошибки, и она возвращается в браузер, параметры выбора не переполняются выбранными пользователем вариантами, даже если возвращаемые значения для этих полей соответствуют значениям параметров в выборках. Кроме того, при возврате формы эти поля не помечаются как имеющие ошибки, даже если их значения не заполнены.

Вот поля частоты и длительности в Rails

<%= frequency_select c, :frequency %>
<%= duration_select c, :duration %>

Метод для частоты_выбора равен

def frequency_select(f, method)
    options = [["day", 1.day], ["other day", 2.days], ["week", 1.week]]
    f.select method, options, :include_blank => true
end

И метод для duration_select -

def duration_select(f, method, unit="day" )
    values, units = *case unit
        when "day" : [[[5, 5], [15, 15], [30, 29]], "days"]
        when "other day" : [[[15, 15], [30, 29], [45,45]], "days"]
        when "week" : [[[4, 29], [6, 43], [8, 57]], "weeks"]
    end
    f.select method, values.map {|(label, i)| ["#{label} #{units}", i.days]}, :include_blank => true
end

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

Если я добавлю этот бит кода в форму

<p><%= @challenge.attributes.inspect %></p>

Я вижу, что это по продолжительности и частоте, когда форма возвращается в браузер:

"duration"=>3888000, "frequency"=>172800

Эти значения соответствуют значениям параметров в полях выбора.

Есть ли в Rails что-то особенное, что нужно сделать, чтобы поля выбора были заново заполнены выбором пользователя? Любые мысли о том, в чем может быть проблема или что я должен попробовать дальше?

Помощь с благодарностью!

-Rick

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

PPS Вот еще один бит информации, которая может иметь значение, но мои тесты показывают, что это, вероятно, не имеет значения. (Хотя я немного новичок в этом, так что не верьте мне на слово.)

Эти два поля связаны между собой с помощью плагина каскадного jquery.

Javascript включен на страницу (не в отдельный файл), а некоторые из js создаются Rails.

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

<script type="text/javascript">
    var list1 = [
        {'When':'86400','Value':' ','Text':' '},
        {'When':'172800','Value':' ','Text':' '},
        {'When':'604800','Value':' ','Text':' '},
        {'When':'86400','Value':'432000','Text':'5 days'},
        {'When':'86400','Value':'1296000','Text':'15 days'},
        {'When':'86400','Value':'2505600','Text':'30 days'},
        {'When':'172800','Value':'1296000','Text':'15 days'},
        {'When':'172800','Value':'2505600','Text':'30 days'},
        {'When':'172800','Value':'3888000','Text':'45 days'},
        {'When':'604800','Value':'2505600','Text':'4 weeks'},
        {'When':'604800','Value':'3715200','Text':'6 weeks'},
        {'When':'604800','Value':'4924800','Text':'8 weeks'}
    ];

    function commonTemplate(item) {
        return "<option value='" + item.Value + "'>" + item.Text + "</option>"; 
};

function commonMatch(selectedValue) {
        return this.When == selectedValue; 
};
</script>

<script type="text/javascript">
    jQuery(document).ready(function(){
        jQuery("#challenge_duration, #user_challenge_duration").cascade("#challenge_frequency, #user_challenge_frequency",{
            list: list1,            
            template: commonTemplate,
            match: commonMatch          
        })
    });
</script> 

А вот и первый скрипт, который находится в файле erb - вы видите, что часть скрипта генерируется Rails

<%= 
    [ [1.day, [[5, 5], [15,15], [30, 29]], "days"],
    [2.days, [[15, 15], [30, 29], [45, 45]], "days"],
    [1.week, [[4, 29], [6, 43], [8, 57]], "weeks"]].map do |(frequency, durations, unit)|

    durations.map do |(label, value)| 
        "{'When':'#{frequency}','Value':'#{value.days}','Text':'#{label} #{unit}'}"
    end 
    end.join(",\n")
-%>

Теперь причина, по которой я не думаю, что имеет значение, генерируется ли длительность с помощью JS, -

  1. проблема все еще существует, если я удаляю все JS
  2. проблема также влияет на частотное поле, параметры которого не генерируются JS

1 Ответ

0 голосов
/ 15 мая 2009

Позволяет проверить сначала частоту Измените код просмотра следующим образом,

<%= frequency_select @challenge, :frequency %>

Изменить вспомогательный метод для Frequency_select на

def frequency_select(objct, method)
    options = [["day", 1.day], ["other day", 2.days], ["week", 1.week]]
    select objct, method, options, :include_blank => true
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...