1

Я это рельсы помощника _fields_answer.html.erbСформировать уникальный идентификатор в рельсах помощника

<fieldset> 
    <div class="row"> 
    <div class="col-xs-9"> 
     <%= answerf.text_area :content, placeholder: "Answer", class: "form-control" %> 
    </div> 

    <%= answerf.hidden_field :question_number, value: qn %> 

    <div class="col-xs-2 buttonProjDel"> 
     <%= answerf.hidden_field :_destroy %> 
     <%= link_to "remove", '#', class: "remove_fields btn btn-danger btn-xs buttonProjDelBut" %> 
    </div> 
    </div> 

    <div class="row"> 
    <div class="col-xs-12"> 
     <% st = Time.now.strftime("%I%M%S%p") %> 
     <%= answerf.text_field :scale, id: 'slf'+st , type: 'text', 
        data: {'slider-id' => 'scale', 
          'slider-min' => '0', 
          'slider-max' => '10', 
          'slider-step' => '1', 
          'slider-value' => '5' } %> 
    </div> 
    </div> 

    <script> 
    $('<%= '#slf'+st %>').slider() 
    </script> 
</fieldset> 

И я сделать этот помощник динамически, но я просто не могу иметь ползунок в первой. Поэтому я старался иметь разные Id для каждого, но я не могу этого сделать. С кодом выше я всегда получаю то же самое Id, даже используя Time.

enter image description here

enter image description here

Почему время используется в id всегда то же самое?

Есть ли другой способ сделать это? Я хочу иметь слайд для каждого ответа.

Edit:

Код, который делает помощника: В projects.js.coffee

$(document).on 'click', 'form .add_fields', (event) -> 
    time = new Date().getTime() 
    regexp = new RegExp($(this).data('id'), 'g') 
    $(this).before($(this).data('fields').replace(regexp, time)) 
    event.preventDefault() 

В application_helper.rb

def link_to_add_fields(name, f, association, locals) 
    new_object = f.object.send(association).klass.new 
    id = new_object.object_id 

    fields = f.fields_for(association, new_object, child_index: id) do |builder| 
     render("fields_" + association.to_s.singularize, answerf: builder, qn: locals[:qn]) 
    end 
    link_to(name, '#', class: "add_fields " + locals[:class], data: {id: id, fields: fields.gsub("\n", "")}) 
    end 

ответ

2

Ваш вид рендеринга было сделано в течение секунды! следовательно, причина, по которой вы видите то же самое значение id для всех inputs.

Заявление, приведенное ниже, будет иметь то же значение в течение 60 секунд.

st = Time.now.strftime("%I%M%S%p") 

Как видно вы хотите ползунок, чтобы быть на каждом входе, я бы рекомендовал использовать либо атрибут данных или просто класс CSS. Пример использования класса CSS будет:

<div class="row"> 
    <div class="col-xs-12"> 
     <%= answerf.text_field :scale, class: 'has-slider', type: 'text', 
        data: {'slider-id' => 'scale', 
          'slider-min' => '0', 
          'slider-max' => '10', 
          'slider-step' => '1', 
          'slider-value' => '5' } %> 
    </div> 
    </div> 

Скажем мы относим класс has-slider, тогда мы могли бы использовать этот селектор класса и выполнить slider() на соответствующих элементов в JavaScript как:

# app/assets/javascripts/input_slider.js.coffee 

$ -> 
    # Execute slider on all inputs with has-slider css class 
    $('input.has-slider').slider() 

И, кажется, знать, почему у вас есть слайдер только на первом входе; Это связано с тем, что все ваши входы имеют одинаковое значение id, а выбор DOM возвращает первое совпадение. id s должны быть уникальными в документе.

Update:

Как вы добавляете входные элементы в DOM после загрузки страницы, то $('input.has-slider').slider() вызов, сделанный на app/assets/javscripts/input_slider.js.coffee не будет работать. Он будет работать только для элементов, уже присутствующих в DOM. Чтобы заставить его работать для элементов, добавленных после загрузки DOM, вы можете использовать метод jQuery on().

Вы можете вызвать некоторые пользовательские события и вызвать slider() метод следующим образом:

# app/assets/javascripts/projects.js.coffee 
$(document).on 'click', 'form .add_fields', (event) -> 
    ... 
    $(this).before($(this).data('fields').replace(regexp, time)).trigger('show-slider') 
    .. 

Тогда вы будете слушать на show-slider событии и называете slider() как:

# app/assets/javascripts/input_slider.js.coffee 

$ -> 
    # Execute slider on all inputs with has-slider css class 
    $('input.has-slider').slider() 

    $(document).on 'show-slider', (event) -> 
    $(input.has-slider').slider() 

Надеется, что это очищает путаницу.

+0

Спасибо @vee Я тоже пробовал с классом, но у меня тот же результат, он просто работает для первого слайда. Это странно, потому что все они имеют один и тот же класс. Любая другая идея? – Mario

+1

Я вижу кнопки удаления, я предполагаю, что у вас есть плюс кнопка где-то на скрытой странице. Вы генерируете эти текстовые поля, используя javascript? – vee

+0

Да, я использую jQuery. Я уточнил вопрос, с более подробной информацией. Вывод, который использует помощник, находится в файле application_helper и работает с кодом jQuery, который я разместил выше. – Mario