Преобразование модуля вызывает проблему, когда данные возвращаются в браузер после отправки формы - Ruby on Rails - PullRequest
0 голосов
/ 01 мая 2009

Фон, часть 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

Ответы [ 2 ]

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

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

Проблема с решением Tomafro состоит в том, что мне потребуются 2 сценария для генерации опций для параметров выбора длительности и частоты, что выполнимо, но весь этот дополнительный код ставит вопрос: зачем мне сначала нужно преобразование? И я не уверен, что я делаю. Я буду смотреть на это дальше, чтобы увидеть, если изменение приведет к непредвиденным ошибкам.

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

Я думаю, что вы связываете себя в узлы, пытаясь конвертировать между секундами и днями. Было бы проще, если бы у вас были определенные методы доступа по частоте / продолжительности в днях, которые сделали преобразование для вас:

def frequency_in_days
  self.frequency && self.frequency / 86400 
end

def frequency_in_days=(days)
  self.frequency = days.to_i * 86400
end

Тогда в своей форме вы можете сделать:

<%= frequency_select c, :frequency_in_days %>

А у тебя в помощнике:

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

Должно сделать все намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...