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