Ruby 2.0.0, Rails 4.0.3

Cuando se activa la selección de año, JavaScript actualmente pasa el nombre de la variable de instancia (@car) de la vista al controlador como una cadena. Necesito pasar una referencia a la variable de instancia en lugar de solo el nombre de la cadena. es posible? Agradecería la ayuda.

EDITAR: he intentado reemplazar la referencia al automóvil de la siguiente manera, pero recibo un error de sintaxis.

var car = $("#<%= @car %>");
Error: Syntax error, unrecognized expression: #<%= @car %>

La vista es:

<div class="span8">
  <%= simple_form_for [:admin, @car],
                      defaults: {label: false},
                      html: {id: 'new_admin_car', class: 'form-vertical'},
                      wrapper: :vertical_form,
                      wrapper_mappings: {
                              check_boxes: :vertical_radio_and_checkboxes,
                              radio_buttons: :vertical_radio_and_checkboxes,
                              file: :vertical_file_input,
                              boolean: :vertical_boolean
                      } do |f| %>
      <%= f.input(:stock_number, {input_html: {form: 'new_admin_car', car: @car}, autocomplete: :off, placeholder: 'Stock number?'}) %>
      <%= f.input(:ymm_year_id, {input_html: {form: 'new_admin_car', car: @car}, collection: YmmYear.all.order("year desc").collect{|c| [c.year, c.id]}, prompt: "Year?"}) %>
      <%= render partial: "makes", locals: {form: 'new_admin_car', car: @car} %>
      <%= render partial: "models", locals: {form: 'new_admin_car', car: @car} %>
      <input type="submit" form="new_admin_car" value="Create Car" class="btn btn-default btn btn-primary">
  <% end %>
</div>

El script actual es:

// when the #year field changes
$("#car_ymm_year_id").change(function () {
    // make a GET call and replace the content
    // First select identifies what has been selected, or fired
    var year = $('select#car_ymm_year_id :selected').val();
    // Pull the variables from the input_html tag
    var form = $('select#car_ymm_year_id').attr("form");
    var car  = $('select#car_ymm_year_id').attr("car");
    // Routes to the controller action
    $.post('/admin/cars/make_list/',
        {
            form: form,
            year: year,
            car: car
        },
        function (data) {
            $("#car_ymm_make_id").html(data);
        });
    return false;
});
-1
Richard_G 28 ago. 2014 a las 13:36

2 respuestas

La mejor respuesta

Al final, todo el concepto es una mala idea. Hice otra pregunta que proporcionó una buena solución.

Crear una instancia con selecciones dependientes

0
Community 23 may. 2017 a las 12:29

De una forma u otra, todo lo que JS puede enviar / recibir son cadenas. Debe codificar su objeto @car en JSON cuando responda a la llamada POST y analizarlo en su función de devolución de llamada.

En el controlador:

@car = {} # do whatever you have to do to find the corresponding car
respond_to do |format|
  format.html
  format.json { render :json => @car.to_json }
end

En su opinión, no olvide agregar un .json al final de la ruta que está llamando en su solicitud POST. En ese caso, creo que sería /admin/cars/make_list.json, pero es posible que tenga que adaptarse.

Luego, en su salida JS, su data var en la consola para verificar si es una cadena sin formato o si es un objeto. No recuerdo si jQuery lo analiza automáticamente o no. Si es una cadena sin procesar, pásala a JSON.parse(your_var) para tener un objeto válido (como se ve aquí)

0
Community 23 may. 2017 a las 11:49