0

我有三个模型:Appointment、Client 和 InsuranceProvider

客户 has_many :appointments

还有一个客户 has_many :insurance_providers (我想在那里存储历史信息)。

在我看来要创建一个新约会,我有这个(除其他外):

<%= f.association :client, label_method: lambda { |c| "#{c.first_name} #{c.last_name}" }, collection: current_user.clients  %>

这很好,但我想进入 insurance_providers 中的 copay 字段。

基本上,这就是你到达那里的方式:

appointment.client.insurance_provider.copay

我想做的是根据从下拉列表中选择的客户预先填充“共付额”字段。

我怎样才能做到这一点?

如果您需要明确查看我的模型或视图,请告诉我。

4

2 回答 2

0

如果我理解正确,您希望根据关联中的值填充第二个选择。

基本上,您需要 JQuery/AJAX 为您执行此操作。JQuery 观察第一个选择,然后 AJAX 根据选择的值从 rails 获取数据,然后 JQuery 再次将值添加到第二个选择。

另一种选择是为每个选择使用像best_in_place这样的就地编辑器,它会为你做 AJAX-y 的东西。

于 2013-10-22T19:33:11.307 回答
0

使用 ajax 根据选择的返回来获取 copay 的值。

因为有很多步骤,我会列出它们,但你可以在其他十几个 SO 问题中找到它们。

添加Javascript,这个coffeescript,但这只是您更改的基础->发送数据调用-因此可以随意更改。

#appointment.js.coffee
$(document).ready ->
  $(".client_select").on "change", ->
    $.ajax
      url: "/appointments/new"
      type: "GET"
      dataType: "script"
      data:
        client: $(".client_select").val()

确保您的表单具有 2 个 jquery 元素来获取数据和推送数据。

# First the field to pull from
<%= f.association :client, label_method: lambda { |c| "#{c.first_name} #{c.last_name}" }, collection: current_user.clients, input_html: { class: 'client_select' }  %>

# And then the field to push to
<%= f.input :copay_amount, input_html: { class: 'copay_from_client' } %>

这将对控制器的“新”操作发出请求appointments,因此您需要添加一个 javascript 响应以确保它可以呈现下一步,即 UJS 文件。

# appointments_controller.rb
def new
  # ... All the stuff you're normally doing and additionally:
  #you'll have to adjust the params argument to match your select field
  insurance_copay = Client.find(params[:client]).insurance_provider.copay
  respond_to do |format|
    format.html # new.html.erb
    format.js { render "new",  locals:{insurance_copay: insurance_copay} }
    format.json { render json: @appointment }
  end 
end

现在添加 UJS,new.js.erb

$(".copay_from_client").val('<%= @insurance_copay %>');
于 2013-10-22T20:03:12.500 回答