0

Ich habe ein Formular mit einer Aufgabe (verwendet Rails4 Autocomplete Edelstein) und ein Projekt text_field. Ich möchte es nur durch Auswählen einer Aufgabe füllen können.So füllen Sie Eingabetext von einer anderen Autocomplete-Rails 4

Also, wenn ich

  • task1: project1

Wenn ich Typ 'ta' und wählen task1 aus dem Autovervollständigen, möchte ich das Projekt Feld sein gefüllt mit dem entsprechenden Projekt (project1 in diesem Fall).

Dies ist die Form:

<%= 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 %> 

Und dies ist der Controller:

class StaticPagesController < ApplicationController 
    autocomplete :task, :name 
end 

die documentation Lesen Ich habe versucht, und fügte hinzu:

:display_value => :task_full_info 

und

class Task < ActiveRecord::Base 
    belongs_to :project 

    def task_full_info 
    self.project.name 
    end 
end 

Aber das funktioniert nicht. Was ist die richtige Art, dies auf Rails 4 mit dem Rails4-Autocomplete-Juwel zu tun? Welche Änderungen sollte ich vornehmen, wenn ich das Projekt text_field in eine Dropdown-Liste ändere?

EDIT: Server-Protokoll:

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) 
+0

war mein Beitrag überhaupt hilfreich? –

+0

Entschuldigung, aber ich konnte bis jetzt an meinem Projekt nicht arbeiten: D – Gaston

Antwort

0

Aus der Dokumentation Sie verknüpft, ich sehe here, was Sie mit :project_name tun wollen. So würde der Code etwas wie folgt aussehen:

<%= 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 %> 

Ich gehe davon aus, dass hier instance_project_name ist die tatsächliche ID des :project_name Textfeld (es sollte, wenn der Code ist, wie Sie angegeben).

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 

Ich würde auch empfehlen Ihnen, Ihr Juwel this one zu ändern, ist, da sie aus der Dokumentation verknüpft und scheint mehr als die aktualisiert werden Sie verwenden.

aktualisieren:

Wie sich herausstellt, hat die Perle der folgenden, wenn die automatische Vervollständigung auslöst:

1) Macht ein Activeselect angesichts der zur automatischen Vervollständigung Feld und was auf der extra_data Option gegeben wird. Deshalb ist das seltsame "project_name" in der Task Abfrage von Ihrem Protokoll.Dann

2) dauert es, dass active Ergebnis und verwendet die send Methode für jedes angeforderte Feld (erneut das automatischen Vervollständigung Feld und die spezifizierte auf extra_data).

Deshalb, wenn Sie ein Feld aus einer anderen Tabelle müssen, wie dieses Problem zu umgehen, ist es erforderlich, dass Sie die foreing_key auf zusätzliche Daten setzen, da sonst 1) wird keinen Zugang zu diesem Fremdschlüssel und wenn 2) es ist ausgeführt es wird die Zuordnung nicht finden.

Ich denke, der Edelstein könnte verbessert werden, indem immer alle Fremdschlüssel in 1) Abfrage auswählen, aber für jetzt müssen Sie mit der Problemumgehung zu vereinbaren.

+0

Auto-Completion funktioniert nicht mehr, nachdem ich hinzugefügt habe: extra_data => [: project_name]. Was ich falsch mache (ich wechsle bereits zu deinem vorgeschlagenen Juwel) – Gaston

+0

Hast du auch den 'update_elements' Code in der Ansicht hinzugefügt? –

+0

Es funktioniert jedoch, wenn ich ändern: Projektname für: Name oder: ID. Es funktioniert sogar, wenn ich eine Funktion aufrufen, die diese Parameter zurückgibt, aber nicht zB self.project.name oder self.project_name. – Gaston

Verwandte Themen