使用“二级”关联从数据库预填充表单字段

时间:2013-10-22 18:41:27

标签: ruby-on-rails forms

我有三种模式:约会,客户和保险提供者

客户has_many:约会

还有一个客户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

我想要做的是根据从下拉菜单中选择的客户端预填充“共付额”字段。

我该怎么做?

如果您需要明确查看我的模型或视图,请与我们联系。

2 个答案:

答案 0 :(得分:0)

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

基本上,你需要JQuery / AJAX来为你做这件事。 JQuery观看第一个选择,然后AJAX根据选择的值从rails获取数据,然后JQuery再次向第二个选择添加值。

另一种方法是为每个选择使用best_in_place之类的就地编辑器,这将为您完成AJAX-y的操作。

答案 1 :(得分:0)

使用ajax根据select的返回值获取copay的值。

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

添加Javascript,这个coffeescript但它只是你的基本改变 - &gt;发送数据通话 - 随意改变。

#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 %>');