【问题标题】:rails 4 : autocomplete with find or create by don't workrails 4:使用查找或创建的自动完成功能不起作用
【发布时间】:2014-04-27 20:35:13
【问题描述】:

我在工作和公司之间建立了一对多的关联,并且我已经实现了这个 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>

当我创建一个工作并从自动完成列表中选择一个公司时,或者当我放置一个新公司并进入工作显示页面时,该工作不会受到选择或创建的公司的影响,为什么?

【问题讨论】:

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


    【解决方案1】:

    您需要为您的自动完成定义一个控制器方法,将其添加到 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 的部分,与自动完成字段结合起来似乎非常危险。我不建议将该操作与自动完成合并,因为您可能会让用户在输入内容以进行搜索时生成双层数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 2017-02-28
      • 2020-11-14
      相关资源
      最近更新 更多