根据先前的字段选择过滤字段

时间:2013-11-24 20:57:34

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

如何根据之前的字段值使用simple_form过滤字段?

例如,我有一个机会表单,有两个字段,公司和联系人。

公司领域:

  <div class="form-group">
    <%= f.association :company, collection: Company.all.order(:account), prompt: "", :label_method => :account, :value_method => :id %>
  </div>

联系领域:

  <div class="form-group">
    <%= f.association :contact, collection: Contact.all.order(:first_name), prompt: "", :label_method => lambda { |contact| "#{contact.first_name} #{contact.last_name}" }, :value_method => :id %>
  </div>

以下是我想要做的事情:如果我从上面的公司字段中选择一家名为“Deviant”的公司,我希望“联系人”字段仅显示与公司名为“Deviant”相关联的联系人。

我正在尝试这样的事情,但无法让它发挥作用:

  <div class="form-group">
    <%= f.association :contact, collection: Contact.where("company_id = ?", params[:id]), prompt: "", :label_method => lambda { |contact| "#{contact.first_name} #{contact.last_name}" }, :value_method => :id %>
  </div>

我不知道如何在公司字段中引用该值。

我该怎么做?

感谢。

更新

任何?当然这一定是可能的。这是任何形式的关键功能。我希望我不需要jQuery或其他东西。

1 个答案:

答案 0 :(得分:1)

我认为最好的方法是在公司选定的值发生变化时,使用ajax请求以dinamically方式更新您的联系人集合。

首先,您需要在联系人控制器中执行操作:

应用程序/控制器/ contacts_controller.rb

class ContactsController < ApplicationController
  def contacts_list
    if params[:company_id]
      @contacts = Contact.where(company_id: params[:company_id])
    else
      @contacts = Contact.all
    end

    respond_with(@contacts) do |format|
      format.json { render :json => @contacts.to_json(:only => [:id, :first_name, :last_name]) }
    end        
  end
end

将此添加到您的路线:

配置/ routes.rb中

  post 'contacts_list' => "contacts#contacts_list", as: :contacts_list

然后使用下面的coffeescript代码填充联系人的集合:

应用程序/资产/ javasctipts / companies.js.coffee

$(document).ready ->
  if $("#opportunity_company_id")
    populate_contacts()
    $("#opportunity_company_id").change ->
      populate_contacts()

populate_contacts = ->
  $contacts_select = $("select#opportunity_contact_id")
  $contacts_select.attr "disabled", "disabled"
  company_id = $("select#opportunity_company_id").val()
  if company_id is ""
    $contacts_select.html "<option value=\"\">(select the company first)</option>"
  else
    $contacts_select.html "<option value=\"\">(loading contacts...)</option>"
    data = {company_id: company_id}
    data[window._auth_token_name] = window._auth_token
    $.ajax "/contacts_list",
      type: "post"
      dataType: "json"
      data: data
      success: (contacts) ->
        _html = '<option value="">Select the contact:</option>'
        _html += '<option value="'+contact.id+'">'+contact.first_name + ' ' + contact.last_name + '</option>' for contact in contacts
        $contacts_select.html _html
        $contacts_select.removeAttr "disabled"
      error: ->
        alert 'Error trying to load contacts.'

最后,在html的head标签内:

<% if protect_against_forgery? %>
  <script>
    window._auth_token_name = "<%= request_forgery_protection_token %>";
    window._auth_token = "<%= form_authenticity_token %>";
  </script>
<% end %>

希望它有所帮助...

更新的 将以下行添加到ApplicationController(app / controllers / application_controller.rb):

respond_to :html, :xml, :json, :js