如何从另一个自动完成Rails 4填充输入文本

时间:2016-05-03 22:19:10

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

我有一个带有任务的表单(使用Rails4自动完成宝石)和一个项目text_field。我希望能够通过选择任务来填补它。

所以,如果我有

  • task1:project1

当我输入'ta',并从自动填充中选择 task1 时,我希望项目字段填充相应的项目(在这种情况下, project1 )。

这是表格:

<%= form_for :instance, url: instances_path do |f| %>
  <%= f.label :task_name %>
  <%= f.autocomplete_field :task_name,   autocomplete_task_name_static_pages_path %>
  <%= f.text_field :project_name %>
<% end %>

这是控制器:

class StaticPagesController < ApplicationController
  autocomplete :task, :name
end

阅读documentation我尝试添加:

:display_value => :task_full_info

class Task < ActiveRecord::Base 
  belongs_to :project

  def task_full_info
    self.project.name
  end
end

但这不起作用。使用rails4-autocomplete gem在Rails 4上执行此操作的正确方法是什么?另外,如果我将项目text_field更改为下拉列表,我应该做出哪些更改?

编辑: 服务器日志:

Started GET "/static_pages/autocomplete_task_name?term=do" for ... at 2016-05-05 18:05:50 -0300
Processing by StaticPagesController#autocomplete_task_name as JSON
  Parameters: {"term"=>"do"}
  User Load (1.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
  Task Load (0.4ms)  SELECT  "tasks"."id" as id, "tasks"."name" as name, "project_name", "tasks"."project_id" FROM "tasks" WHERE (LOWER(name) LIKE 'do%')  ORDER BY LOWER(name) ASC LIMIT 10
  Project Load (0.3ms)  SELECT  "projects".* FROM "projects" WHERE "projects"."id" = ? LIMIT 1  [["id", 7]]
Completed 200 OK in 10ms (Views: 0.3ms | ActiveRecord: 1.9ms)

1 个答案:

答案 0 :(得分:0)

在您关联的文档中,我看到了here您想要对TextMessagesAsRecipient做些什么。所以你的代码看起来像是:

async.parallel({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: function(callback){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }
},
function(err, results) {
    // results is now equals to: {one: 1, two: 2}
});

我在此假设 instance_project_name :project_name文本字段的实际ID(如果代码与您所说的那样,则应该如此)。

<%= form_for :instance, url: instances_path do |f| %>
  <%= f.label :task_name %>
  <%= f.autocomplete_field :task_name, autocomplete_task_name_static_pages_path, :update_elements => {:project_name => '#instance_project_name'} %>
  <%= f.text_field :project_name %>
<% end %>

我还建议您将宝石更改为this one,因为它与文档相关联,并且似乎比您正在使用的宝石更新。

<强>更新

事实证明,当自动完成触发时,gem会执行以下操作:

1)根据:project_name选项给出自动填充字段和内容,制作 Activerecord class StaticPagesController < ApplicationController autocomplete :task, :name, :extra_data => [:project_id, :project_name] end class Task < ActiveRecord::Base belongs_to :project delegate :name, to: :project, prefix: true end 。这就是为什么来自您日志的select查询中出现奇怪的extra_data的原因。

2)然后它需要 Activerecord 结果,并对每个请求的字段使用"project_name"方法(同样,自动完成字段和Task上指定的字段)。

这就是为什么每当你需要一个来自联合表的字段时,作为一种解决方法,它是必需你在foreing_key上放了额外的数据,否则 1)无法访问该外键,当 2)执行时,它无法找到该关联。

我想通过始终在 1)查询中选择所有外键可以改善gem。但是现在你必须解决这个问题。