【问题标题】:Rails AJAX Passing Variable From Controller to Partial Not WorkingRails AJAX将变量从控制器传递到部分不起作用
【发布时间】:2015-04-13 19:42:02
【问题描述】:

我在将变量从控制器传递到部分异步时遇到问题。我希望在用户从下拉菜单中选择一个选项后,在我的视图上呈现一个表单。问题是我不断收到此错误:

undefined local variable or method `shipment_options' for #<#    <Class:0x007f92941be8f0>:0x007f929ca78ad8> 

即使我使用类似locals: { var: @var } 或类似的东西。这是我认为的代码:

<body>
  <p>
    This is the body<br>

    <%= select_tag :service, options_for_select(usps_services), { id: "service_select", remote: true } %><br>

  <div id='shipment_option'>
    <%= render 'shipment_option', remote: true, locals: { shipments: @shipment_options } %>

  </div>
</body>
<script>
$('#service_select').on('change', function () {
    var service = $('#service_select').val();
    $.ajax({
      type: "POST",
      url: '/service_select',
      format: 'js',
      data: { service: service, order_id: <%= params[:order_id] %> },
      success: function (data) {
        console.log(data.rates);
        return true;
      },
      error: function (data) {
        return false;
    }});

});
</script>

处理该 AJAX 请求的路由

# AJAX
# get '/ajax/:service' => 'dashboards#get_shipment'
post '/service_select' => 'dashboards#get_shipment'

控制器中的get_shipment方法

def get_shipment
  order = Order.find(params[:order_id])
  respond_to do |format|

  from_address = EasyPost::Address.create(
    :street1 => Rails.configuration.from_address[:street1],
    :street2 => Rails.configuration.from_address[:street2],
    :city => Rails.configuration.from_address[:city],
    :state => Rails.configuration.from_address[:state],
    :zip => Rails.configuration.from_address[:zip]
  )

  to_address = EasyPost::Address.create(
    :name => order.name,
    :street1 => order.street1,
    :street2 => order.street2,
    :city => order.city,
    :state => order.state,
    :zip => order.zip
  )

  parcel = EasyPost::Parcel.create(
    :predefined_package => params[:service],
    :weight => 10
  )

  @shipment_options = EasyPost::Shipment.create(
    :to_address => to_address,
    :from_address => from_address,
    :parcel => parcel
  )
  # format.json { render json: ActiveSupport::JSON.encode(shipment_option) }
  format.js { render json: @shipment_options, action: "new" }
end 

结束

以及我尝试渲染的部分代码

<%= form_for(@shipment) do |f| %>
  <% shipment_options.rates.each do |rate| %>
    <%= f.label :shipment_service %> 
    <%= rate.service + " " + rate.rate.to_s %>
    <%= f.check_box :shipment_service %>
  <% end %>
  <%= f.submit "Ship package" %>
<% end %>

我怎样才能摆脱这个错误?谢谢。

【问题讨论】:

    标签: javascript ruby-on-rails ruby ajax


    【解决方案1】:

    看起来您将@shipment_options 作为货件传递给您的部分,但在您的部分中,您正在调用未定义的 shipping_options。

    【讨论】:

    • 好吧,即使在将 @shipment_options 更改为 shipments 之后,因为我已经传入了 locals 变量,我仍然得到相同的 undefined method 错误。
    • 我认为错误的发生是因为页面试图在 AJAX 调用之前呈现我的部分。我只是不知道如何让rails“等待”评估/加载部分,直到在控制器中设置变量之后。我确实只使用了 javascript,但我无法仅使用 Ruby 进行复制。
    • 哦,我明白了。我假设你有另一个控制器(它呈现模板)也定义了@shipment_options'。如果您在那里定义@shipment_options,您实际上根本不需要ajax 请求。渲染视图的控制器中有什么?
    【解决方案2】:

    好的,我通过从控制器中的format.js 中取出所有参数,然后将.js.erb 设置为get_shipment.js.erb 来解决问题。然后在我通过写入呈现部分之前设置我的@shipment_options

    $('#shipment_option').html("<%= j(render 'shipment_option') %>");
    

    因为我已经设置了实例变量,所以表单随后正确呈现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      相关资源
      最近更新 更多