通过JavaScript将实例变量从视图传递到控制器

时间:2014-08-28 09:36:52

标签: javascript ruby-on-rails

Ruby 2.0.0,Rails 4.0.3

当触发年份选择时,JavaScript当前将实例变量(@car)的名称从视图传递给控制器​​作为字符串。我需要传递对实例变量的引用,而不仅仅是字符串名称。这可能吗?我很感激帮助。

编辑:我已尝试按如下方式更换对汽车的引用,但收到语法错误。

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

观点是:

<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>

当前脚本是:

// 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;
});

2 个答案:

答案 0 :(得分:0)

无论如何,所有JS都可以发送/接收字符串。在回答POST调用时,您需要在JSON中对@car对象进行编码,并在回调函数中对其进行解析。

在控制器中:

@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

在您看来,不要忘记在POST请求中调用的路径末尾添加.json。在这种情况下,我相信它会/admin/cars/make_list.json,但你可能需要适应。

然后在您的JS输出中,在控制台中输出data var,以检查它是否为原始字符串,或者它是否为对象。我不记得jQuery是否会自动解析它。如果它是原始字符串,请将其传递给JSON.parse(your_var)以获得有效对象(as seen here

答案 1 :(得分:0)

最后,整个概念都是一个坏主意。我问另一个问题提供了一个很好的解决方案。

Creating an instance with dependent selects