我在工作和公司之间有一对多关联,我已经实现了此railscast中提到的自动完成功能enter link description here
这是我的工作模式
class Job < ActiveRecord::Base
belongs_to :company
extend FriendlyId
friendly_id :job_title, use: :slugged
def company_name
company.try(:name)
end
def company_name=(name)
self.company = Company.find_or_create_by_name(name) if name.present?
end
end
这是我公司的模特
class Company < ActiveRecord::Base
has_many :jobs
extend FriendlyId
friendly_id :name, use: :slugged
end
这是我的jobs.js.coffe文件
jQuery ->
$('#job_company_name').autocomplete
source: $('#job_company_name').data('autocomplete-source')
这是我的工作表格视图
<div class="form-group">
<%= f.label :company_name %><br />
<%= f.text_field :company_name, data: {autocomplete_source: Company.order(:name).map(&:name)} %>
</div>
<div class="form-group">
<%= f.label :job_title, "Intitulé du poste", class: "jobs-newtitles" %><br>
<%= f.text_field :job_title, class: "form-control form-newjob" %>
</div>
这是我的工作展示视图
<div class="job-title-show">
<h3><%= @job.job_title %></h3>
<div class="time_ago">
Publiée <%= distance_of_time_in_words_to_now(@job.created_at) %>
<p>
<strong>company:</strong>
<%= @job.company_name %>
</p>
</div>
当我创建一份工作并从自动完成监听中选择一家公司时,或当我放一家新公司并进入工作展示页面时,该工作不会对所选公司或创建的公司产生影响?
答案 0 :(得分:0)
您需要为自动完成定义一个控制器方法,将其添加到routes.rb,然后将其作为源引用,而不是直接在视图中的模型上调用某个方法:
在你的company_controller.rb中:
def autocomplete_name
@companies = Company.order(:name).where("name ILIKE ?", "%#{params[:term]}%")
respond_to do |format|
format.json {
render json: @companies.map(&:name)
}
end
end
我假设您正在使用jQuery UI的自动填充功能,它会将您输入的单词作为term
参数输入到指定的任何来源。
:
get '/companies/autocomplete/names' to: 'company#autocomplete_name'
在这种情况下,您的来源将是/companies/autocomplete/names.json
请务必使用浏览器的控制台对其进行调试,以确定是否将AJAX调用发送到正确的位置以及不是。
更新:刚看到部件有find_or_create_by_name,与自动完成字段结合似乎非常危险。我不建议将该操作与自动填充功能合并,因为您可能会在为搜索目的输入内容时让用户生成双层数据。