如何从另一个自动完成中填充输入文本 Rails 4
How to fill input text from another autocomplete Rails 4
我有一个带有任务(使用 Rails4 自动完成 gem)和项目 text_field 的表单。我希望能够通过 select 执行任务来填充它。
所以如果我有
- 任务 1:项目 1
当我从自动完成中键入 'ta' 和 select task1 时,我想要 project 字段填写相应的项目(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)
从您链接的文档中,我看到 here 您想要对 :project_name
做什么。所以你的代码看起来像:
<%= 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 %>
我在这里假设 instance_project_name 是 :project_name
文本字段的实际 ID(如果代码如您所述,则应该如此) .
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
我还建议您将 gem 更改为 this one,因为它是从文档链接而来的,而且似乎比您正在使用的更新了。
更新:
事实证明,gem 在自动完成触发时执行以下操作:
1) 生成 Activerecord select
给定自动完成字段和 extra_data
选项中给出的内容。这就是为什么您的日志中 Task
查询中出现奇怪的 "project_name"
的原因。
2) 然后获取 Activerecord 结果并对每个请求的字段使用 send
方法(同样,自动完成字段和在 extra_data
).
这就是为什么每当您需要连接的 table 中的字段时,作为解决方法, 需要 将额外数据放入 foreing_key,因为否则 1) 将无法访问该外键,并且当 2) 被执行时它将找不到关联。
我想 gem 可以通过始终选择 1) 查询中的所有外键来改进,但现在你必须解决这个问题。
我有一个带有任务(使用 Rails4 自动完成 gem)和项目 text_field 的表单。我希望能够通过 select 执行任务来填充它。
所以如果我有
- 任务 1:项目 1
当我从自动完成中键入 'ta' 和 select task1 时,我想要 project 字段填写相应的项目(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)
从您链接的文档中,我看到 here 您想要对 :project_name
做什么。所以你的代码看起来像:
<%= 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 %>
我在这里假设 instance_project_name 是 :project_name
文本字段的实际 ID(如果代码如您所述,则应该如此) .
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
我还建议您将 gem 更改为 this one,因为它是从文档链接而来的,而且似乎比您正在使用的更新了。
更新:
事实证明,gem 在自动完成触发时执行以下操作:
1) 生成 Activerecord select
给定自动完成字段和 extra_data
选项中给出的内容。这就是为什么您的日志中 Task
查询中出现奇怪的 "project_name"
的原因。
2) 然后获取 Activerecord 结果并对每个请求的字段使用 send
方法(同样,自动完成字段和在 extra_data
).
这就是为什么每当您需要连接的 table 中的字段时,作为解决方法, 需要 将额外数据放入 foreing_key,因为否则 1) 将无法访问该外键,并且当 2) 被执行时它将找不到关联。
我想 gem 可以通过始终选择 1) 查询中的所有外键来改进,但现在你必须解决这个问题。