Фон, часть 1 У меня есть форма, которая собирает как частоту, так и продолжительность от пользователя. Мы устанавливаем частоту и продолжительность в секундах, но для пользователя они всегда представлены в днях или неделях. Например, пользователь видит «каждый второй день», но значение, установленное для параметра, равно «172800», поскольку это количество секунд в 2 днях.
Справочная информация, часть 2 Я работаю над приложением, в котором мы хотим, чтобы пользователь имел код приглашения, чтобы иметь возможность использовать его. Таким образом, в рамках регистрации пользователь должен ввести код приглашения, связанный с конкретным адресом электронной почты.
Справочная информация, часть 3 Я новичок в RoR и работаю над чужим кодом. У меня около 10 глав в 3-м выпуске «Agile Web Development с Rails». Человек, написавший это, не может задать им вопросы до следующей недели, и я бы хотел решить это до этого. Если я не получу разрешение до этого, я опубликую ответ здесь, как только получу.
Проблема Когда пользователь отправляет форму со всеми соответствиями, кроме кода приглашения и адреса электронной почты, форма возвращается, а частота и продолжительность не заполняются повторно. Теперь я знаю, почему это происходит. Я просто не знаю, как это исправить. Давайте покопаемся в каком-нибудь коде, ладно?
Вот код RoR для создания полей формы выбора длительности и частоты:
<%= 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
Теперь самое интересное. Вот код для ": частоты"
def frequency(unit=:days)
seconds = super
convert_seconds_to_units(seconds, unit)
end
(Подожди.)
А вот код для ": duration"
def duration(unit=:days)
seconds = super
convert_seconds_to_units(seconds, unit)
end
Причина, по которой поля длительности и частоты не заполняются повторно, заключается в том, что проверка на соответствие кода приглашения и адреса электронной почты происходит после частота и продолжительность преобразуются в дни.
Посмотрите, если в форме есть другие ошибки, помимо адреса электронной почты и приглашения, которые не совпадают, преобразование из секунд в дни не происходит. Но, если все остальное проверяется, происходит преобразование, а затем сравниваются код приглашения и адрес электронной почты. В случае ошибки данные возвращаются в браузер, но значения длительности и частоты теперь указаны в днях и не соответствуют значениям (в секундах) продолжительности и частоты в форме HTML.
Итак, мой вопрос - и я полагаю, что это полный вопрос новичка - как вы задерживаетесь при преобразовании значений частоты и длительности до тех пор, пока не будут сопоставлены код приглашения и адрес электронной почты.
Позвольте мне знать, если вам нужно увидеть больше кода. Я пытался предоставить все, что вам нужно, не перегружая вас. Хотя, если я что-то пропустил, просто дай мне знать.
Спасибо!
Rick