2010-07-07 1 views
0

Я использую частичные части Rails в сочетании с шаблонами дочерних полей jQuery для динамического создания форм с несколькими вложенными дочерними атрибутами. Внутри этих партиций находится JavaScript, который запускается, когда различные события (например, onChange) встречаются в форме, а исполняемый код должен изменить DOM для связанного, но другого элемента формы. В этом конкретном случае я использую его для добавления нескольких транзакций продажи в решении типа точки продажи для определенной группы транзакций и контроля за тем, какие данные собираются для каждой транзакции. Так, например:Автогенерировать идентификаторы HTML-элементов в Rails при повторении одного и того же элемента управления с помощью парциальных чисел

  1. Пользователь нажимает на ссылку, которая добавляет 3 новые записи транзакций в группу транзакций.
  2. Пользователь устанавливает разные значения в каждой из этих трех записей транзакций, каждый из которых запускает событие onChange, которое вызывает функцию JS, которая должна манипулировать DOM для каждого из событий различными способами. (Пример: транзакция 1 может быть возвратом, поэтому она изменяет текст транзакции от стоимости до возврата, транзакция 2 может быть для службы, поэтому она изменяет статус налогообложения и т. Д.)
  3. Функция JS имеет чтобы иметь возможность изменить DOM для правильной транзакции.

Моя проблема # 3 - в DOM элементы модифицируются не такой же, как элемент, генерирующий событие, поэтому я не могу использовать JS это. Они являются частью общего родительского элемента (т. Е. Имеют общий родительский <div>), поэтому для использования родительских/дочерних селекторов jQuery может быть возможным перейти к правильному элементу в DOM. Однако даже это требует некоторой уникальности в атрибутах div id, и я не уверен, что в Rails лучше всего их динамически генерировать.

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

Любые рекомендации приветствуются. Благодаря!

ответ

1

Использование текущего времени является рецептом за боль и необъяснимые ошибки. Я настоятельно рекомендую вам использовать что-то вроде GUID generator для генерации уникальных идентификаторов.

+0

«uuid» SecureRandom тоже работает: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/securerandom/rdoc/SecureRandom.html –

0

вы можете использовать Time.now в качестве уникального идентификатора-при создании нового тега

Time.now.to_i 

это не хак или что-то, что идет вразрез с Rails принципы ;-)

+0

Спасибо - моя единственная забота в том, что to_i измеряет время с точностью в секундах, поэтому, если кто-то быстро щелкнул ссылку, можно было бы добавить два набора div с одним и тем же идентификатором. Полагаю, я мог бы использовать to_f, что было бы более высокой точностью ... Я посмотрю, как это работает. –

+0

да, вы можете использовать to_f вместо to_i, чтобы получить более резкость;) –

+0

@DavidJames не нужно быть грубым. Да, есть известный недостаток в использовании текущего времени, и я не собираюсь продавать его как * твердое решение *, которое соответствует всем потребностям. Тем не менее, * он просто работает * для небольших потребностей: 1-2 пользователей, нажимая кнопку, чтобы применить изменения в DOM. ИМХО, нет необходимости бросать самородные камни для решения тривиальной потребности. Хотите больше псевдослучайности? использовать (rand (10000) + Time.now.to_f). Требуется 100% -ное рабочее решение? используйте драгоценный камень uuid. это оно. –