ruby-on-rails-4 datepicker jquery-ui-datepicker simple-form turbolinks

ruby on rails 4 - Rails 4+simple_form y jQuery UI. Datepicker no funciona a través de turbolinks



ruby-on-rails-4 jquery-ui-datepicker (3)

Finalmente encontré una solución adecuada:

app / inputs / datepicker_input.rb se deja igual, la envoltura funciona bien.

assets / javascripts / application.js

//= require jquery //= require jquery_ujs //= require turbolinks //= require bootstrap.js //= require_tree . $(document).on("page:load ready", function(){ $("input.datepicker").datepicker(); });

Dado que: el tipo de entrada datepicker agrega la clase ".datepicker" al HTML renderizado, es suficiente con unir datepicker () a todos los elementos con esa clase. Hace el truco con la menor cantidad de código.

Es importante especificar "input.datepicker" ya que la clase ".datepicker" se agrega tanto a la etiqueta como a las etiquetas de entrada.

turbolinks lanza una página: evento de carga, por lo que he agregado controlador para ambos casos: cuando la página se carga con turbolinks y cuando se carga desde cero (actualización de ventana, enlace guardado en favoritos, etc.)

Ahora el siguiente .html.erb se representa como espero:

<%= f.input :expiration_date, as: :datepicker, required: false, :placeholder => ''Select date'', input_html: {class: "form-control"}, label: "Expiration date: " %>

salida:

<div class="control-group datepicker optional order_expiration_date"> <label class="datepicker optional control-label" for="order_expiration_date">Expiration date: </label> <div class="controls"> <input class="datepicker optional form-control hasDatepicker" id="order_expiration_date" name="order[expiration_date]" placeholder="Select date" type="text"> <input class="expiration_date-alt" id="order_expiration_date" name="order[expiration_date]" type="hidden"> </div> </div>

Tengo este formulario que llama a datepicker:

... <%= f.input :expiration_date, as: :datepicker, required: false %> ...

Envoltorio de Simple_form: app / inputs / datepicker_input.rb

class DatepickerInput < SimpleForm::Inputs::Base def input @builder.text_field(attribute_name, input_html_options) + / @builder.hidden_field(attribute_name, { :class => attribute_name.to_s + "-alt"}) end end

Cuando la página se carga desde cero (evento $ (documento) .ready ), se genera el siguiente html:

<input class="datepicker optional form-control hasDatepicker" id="order_expiration_date" name="order[expiration_date]" type="text">

Sin embargo, cuando la página se carga con turbolinks (desde la barra de navegación lateral, evento "página: cargar"), el HTML renderizado es el siguiente:

<input class="datepicker optional form-control" id="order_expiration_date" name="order[expiration_date]" type="text">

Por supuesto, puedo simplemente agregar la clase hasDatepicker en .html.erb o en el archivo application.js, pero me pregunto si es posible lograrlo con la funcionalidad de Rails.


Prueba esto:

<%= f.text_field :expiration_date, as: :datepicker, :placeholder => ''Select Expiration Date'' %>

Javascript

$(document).ready(function() { $(''#order_expiration_date'').datepicker({ changeMonth: true, changeYear: true, yearRange: ''-70:-18'' }); });

app / assets / javascript / application.js debería ser

//= require jquery //= require jquery.turbolinks //= require jquery_ujs //= require jquery.ui.all //= require turbolinks


Lo siguiente me funciona en simple_form y jquery-ui :

js:

$(''input#date_field'').datepicker();

formar:

<%= f.text_field :expiration_date, :placeholder => ''Select Date'' %>

Entonces sin as: :datepicker .