Javascript 如何将JS变量异步发送到Rails

Javascript 如何将JS变量异步发送到Rails,javascript,jquery,html,ruby-on-rails,Javascript,Jquery,Html,Ruby On Rails,视图中的简单HTML表单。当用户切换表单时,我需要将表单的用户选择值传递到活动记录查询中。(可能不是params,因为这样它就不会是异步的?) 在下面的示例中,我需要将business_id作为表单的值。rails的新功能,因此如果您可以提供一些页面内javascript,我将在稍后将其重构到参考资料中 <select name="clients"> <option value="1">Tesla</option> <option value="

视图中的简单HTML表单。当用户切换表单时,我需要将表单的用户选择值传递到活动记录查询中。(可能不是params,因为这样它就不会是异步的?)

在下面的示例中,我需要将business_id作为表单的值。rails的新功能,因此如果您可以提供一些页面内javascript,我将在稍后将其重构到参考资料中

<select name="clients">
  <option value="1">Tesla</option>
  <option value="4">Chevy</option>
</select>

<table>
  <% @clients.where(month_year:'2015-02',business_id:'NEED VALUE OF HTML FORM HERE').find_each do |client| %>
    <tr>
      <td><%= client.month_year %></td>
      <td><%= client.business_id %></td>
      <td><%= client.bill_charge %></td>
    </tr>
  <% end %>
</table>

特斯拉
雪佛兰
  • 将结果表放在一个部分中
  • 在select的on change事件上触发ajax请求
  • 根据作为请求变量传递的select的值(`@clients')呈现表

    • 为了阐述其他答案,这里有一个(也许)过于简化的模型

      客户端视图 在这里,您需要调用
      render
      ,它指向一个部分。此部分将包含表数据(因此稍后可以恢复)。您还需要为select语句提供一个类,jquery可以轻松获取该类来异步获取客户机数据

      # app/views/clients/index.html.erb
      <%= select_tag "business", options_from_collection_for_select(Business.all, "id", "name"), class: "car-select" %>
      
      <div class="clients-table">
        <%= render "table_list" %>
      </div>
      
      业务控制器处理请求 在ajax请求中,您调用的是一个类似于“”的URL,它真正击中了业务控制器的
      show
      操作。你想这样做,因为它完全是RESTful的,你不需要改变任何路线。但是,您需要编辑操作以为客户端提供实例变量

      # app/controllers/businesses_controller.rb
      def show
        @business = Business.find(params[:id])
        @clients = @business.clients (this assumes that you already have a proper has_many / belongs_to relationship between business and client)
        respond_to do |format|
          format.html
          format.js
        end
      end
      
      UJS视图 拼图的最后一块是UJS视图。这是javascript,只有当js请求类型被发送到特定的控制器操作时才会调用它。在本例中,显示业务控制器的操作。这将获取新创建的
      @clients
      ,并用部分和新数据替换现有表

      #app/views/businesses/show.js.erb
      $(".clients-table").html("<%= escape_javascript(render( '/clients/table_list', client: @clients)) %>");
      
      #app/views/business/show.js.erb
      $(“.clients表”).html(“”);
      

      如果您仍然有疑问,或者想做更复杂的事情,您应该研究一下UJS模板和回调。

      您不能将HTML值放在其中,因为Ruby在页面呈现之前就已经处理好了,用户操作也在之后。您需要使用AJAX发送选择并返回结果。哇。。所有这些都将传递一个选择值。。我已经错过了node.js,但必须使用rails。。。回答得很好,但你不仅仅是在传递一个选择值。您还需要在服务器上查询对象列表,然后必须对该返回进行处理。您可以在js回调和ujs部分中完成这一切,并将其作为JSON进行处理,从中选择JSON并更新表。
      # app/controllers/businesses_controller.rb
      def show
        @business = Business.find(params[:id])
        @clients = @business.clients (this assumes that you already have a proper has_many / belongs_to relationship between business and client)
        respond_to do |format|
          format.html
          format.js
        end
      end
      
      #app/views/businesses/show.js.erb
      $(".clients-table").html("<%= escape_javascript(render( '/clients/table_list', client: @clients)) %>");