У меня есть код, структурированный таким образом, что нажатие на кнопку "Редактировать" отображает скрытую форму (написанную во встроенном рубине) в теге "div" html и внутри этой формы - это text_field_tag, идентификатор которого используется для привязки к дате выборке используя JQuery.
Используя мой текущий код представления и код датпикера jquery в rails: я могу нажать кнопку редактирования и выбрать дату, используя text_field_tag для каждой формы. Однако, когда я пытаюсь представить значение datepicker, он отправляется только для первой формы (для первого "td-элемента").
Я предполагаю, что я делаю что-то не так с кодом JQuery. Можете ли вы указать, как я могу представить значение datepicker для соответствующей формы (ближайшая форма внутри "td" при нажатии кнопки), а не только для представления первой формы ( первый элемент 'td')
Вот мой код:
ВЗГЛЯД В RAILS:
<h2>Files</h2>
<table class="table">
<tr>
<th>Filename</th>
<th>Description</th>
<th>Download Link</th>
</tr>
<% @files.each do |file| %>
<% filename = file.split('/').last %>
<% object = @bucket.objects[file] %>
<tr>
<td><%= filename %></td>
<td>
<div class="file_description"><%= object.metadata['description']%>
<button id ="button1" type="button" class= "btn btn-default
edit_description" onclick="Window(this)">Edit</button>
</div>
<div id = 'hidden_form' class="file_description_update" >
<%= form_tag({:action => 'update_file_info'}, multipart: true) do %>
Update File Description: <%= text_area_tag :description %>
<%= hidden_field_tag :s3_path, file %>
<%= hidden_field_tag :prefix, @prefix %>
<%= text_field_tag 'user_input' %>
<%= submit_tag 'Submit' %> </td> <br />
<% end %>
</div>
</td>
Код для JQuery в файле application.js в Rails:
//= require jquery
//= require jquery_ujs
//= require twitter/bootstrap
//= require bootstrap
//= require_tree .
//= require jquery.ui.all
//= require jquery.ui.datepicker
$(document).ready(function(){
$( "button.edit_description" ).on( "click", function( event ) {
$(this).closest('td').find("div.file_description_update" ).show();
$(this).closest('td').find("div.file_description_update"
).find('#user_input').datepicker();
});
});
Я действительно получил его для работы, НЕ назначая какой-либо идентификатор text_field_tag и только используя класс для доступа к text_field_tag в каждой форме для каждого файла в цикле, используя jquery --so, по существу в моем решении, только jquery предоставляет уникальные идентификаторы для формы. Я где-то читал его на другом форуме.
Мое решение в коде:
RAILS VIEW:
<%= text_field_tag '', '',:class => "datepicker" %>
Файл RAILS application.js: (код JQUERY для datepicker):
$(document).ready(function(){
$('.datepicker').each(function(){
$(this).datetimepicker();
});
});
Я только что закончил работу над подобной проблемой. часть проблемы заключается в том, что jquery изменяет идентификатор и дает класс всем атрибутам, которые его вызывают. Одним из решений является использование нокаута для абстрагирования необходимости ручной модификации DOM. Хорошее решение можно найти здесь: JSFiddle
Там целый беспорядок вопросов, связанных с datepicker вызывает проблемы, когда люди пытаются mod DOM напрямую и получить некоторые неожиданные результаты.
Ее мое решение я разместил в другом вопросе:
ko.bindingHandlers.datepicker = {
init: function(element, valueAccessor, allBindingsAccessor) {
var $el = $(element);
//initialize datepicker with some optional options
var options = { minDate: 0};
$el.datepicker(options);
//handle the field changing
ko.utils.registerEventHandler(element, "change", function() {
var observable = valueAccessor();
observable($el.datepicker("getDate"));
});
},
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()),
$el = $(element),
current = $el.datepicker("getDate");
if (value - current !== 0) {
$el.datepicker("setDate", value);
}
}
};