rails 4:使用find或create by自动完成不起作用

时间:2014-03-20 18:50:21

标签: ruby-on-rails ruby-on-rails-4 autocomplete associations

我在工作和公司之间有一对多关联,我已经实现了此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>

当我创建一份工作并从自动完成监听中选择一家公司时,或当我放一家新公司并进入工作展示页面时,该工作不会对所选公司或创建的公司产生影响?

1 个答案:

答案 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参数输入到指定的任何来源。

你的routes.rb中的

get '/companies/autocomplete/names' to: 'company#autocomplete_name'

在这种情况下,您的来源将是/companies/autocomplete/names.json

请务必使用浏览器的控制台对其进行调试,以确定是否将AJAX调用发送到正确的位置以及不是。

更新:刚看到部件有find_or_create_by_name,与自动完成字段结合似乎非常危险。我不建议将该操作与自动填充功能合并,因为您可能会在为搜索目的输入内容时让用户生成双层数据。