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