如何根据之前的字段值使用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或其他东西。
答案 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