在提交表单之前,根据下拉列表的值更改动态填充表单字段

时间:2015-12-20 07:19:07

标签: ruby-on-rails ajax simple-form

我正在处理RoR项目的订单,并希望用数据库中的现有客户信息填充买家信息。因此,我需要从下拉列表中选择客户名称(选择字段),然后使用所选客户的信息填写买家信息字段(姓名,电话,电子邮件,地址等)。

因此,我的问题是,这样做的首选做法是什么?我的想法类似于使用GET方法进行Ajax调用以获取json格式数据,然后使用jQuery填充或更改买方信息字段。这是正确的" rails way"实现这个功能?

顺便说一下,整个订单表单是simple_form,买家信息字段都在simple_fields_for部分。如果这有帮助。

2 个答案:

答案 0 :(得分:6)

执行此操作的“标准”方式是通过ajax(只需向您的RewriteEngine on Options +FollowSymlinks +MultiViews -Indexes 操作发送JSON请求,它应该返回您请求的用户数据 - 我将写入一秒钟。

从您的问题来看,您似乎应该做点其他事情。

  

使用数据库中的现有客户信息填写买家信息

这是不良做法 - 它会导致数据库中的重复条目。

应该采用的方法是利用Rails中的associations关联 users#show新买家信息:

customer

这会在#app/models/order.rb class Order < ActiveRecord::Base belongs_to :customer #-> requires "customer_id" in "orders" table end #app/models/customer.rb class Customer < ActiveRecord::Base has_many :orders end customer上创建一个关联order对象,该对象将返回您其他数据库表中的数据。

您必须确保为新的@order.customer对象填充customer_id参数:

Order

<强> JS

您基本上需要向#app/controllers/orders_controller.rb class OrdersController < ApplicationController def new @customers = Customer.all @order = Order.new end def create @order = Order.new order_params @order.save end private def order_params params.require(:order).permit(:customer_id, :etc, :etc) end end #app/views/orders/new.html.erb <%= form_for @order do |f| %> <%= f.collection_select :customer_id, @customers, :id, :name %> <%= f.submit %> <% end %> 操作发送Ajax(JSON)请求,该请求会将特定customers#show的相关字段返回给您的JS:

customer

答案 1 :(得分:-1)

如果您想根据用户的选择填充表单,那么您绝对需要使用某种javascript解决方案。要么进行AJAX调用,要么就是可行的(即你没有太多的客户以这种方式序列化,而且不是安全性或性能问题)你可以将客户数据作为json预加载到你的前端javascript中所以(在你看来):

<script>
   var customerData = JSON.parse(<%= @customers.to_json %>);
</script>

然后让所选用户的数据根据​​该变量中的数据填充表单。

这样可以提供更快更顺畅的用户体验,并且在每次用户更改该选择框的值时,不必在后端更容易进行AJAX调用。