2008-10-11 21 views
9

Rails uygulamasında bir metin giriş alanı için "öneri" özelliğini nasıl uygulayacağınız için en kolay yolu arıyorum. Buradaki fikir, bir veritabanı sütununda saklanan isimleri tamamlamak ve kullanıcıya o tipteki olası eşleşmelerden oluşan bir açılır menü sunmaktır.Bir raylar uygulamasında metin kutuları için "öneri" özelliği

Önerileriniz için teşekkürler!

cevap

1

DÜZENLEME: teorik referans noktası bir tür burada bu cevabı bırakacağım ama autocompleter answer sana :)

Yasal Uyarı daha faydalı olması muhtemeldir gibi geliyor: I (Google için çalışmak rağmen hangi açıkça, çeşitli UI'lerde "Öner" öğelerine sahiptir) Bu alandaki herhangi bir koda bakmadım, hatta istemci tarafı açısından kimseyle konuşmamıştım.

Sunucu tarafı dili burada büyük olasılıkla alakasız. Önemli olan, istemci tarafında gereken AJAX'tır.

Kullanıcı, metin kutusuna bir tuşa her girdiğinde sıfırlanan ve kullanıcı metin kutusundan ayrılırsa iptal edilen yaklaşık 1 saniye (tatlı nokta bulma deneyi) için bir zamanlayıcıya sahip olmanızı öneririm. Zamanlayıcı patlarsa, bir AJAX isteğini ateşleyin. AJAX isteği, kullanıcının şu ana kadar yazdığı şeyi içerecektir. AJAX yanıtı, öneri listesi ve orijinal istek metni olmalıdır.

AJAX yanıtı döndüğünde, metin kutusundaki metin hala yanıttaki alanla aynıdır (yani, kullanıcı o zamandan beri yazmamıştır) ve metin kutusunda hala odak varsa, bir açılır menü sunun. (HTML combobox'ları ile ilgili olarak bu şeylerin yüzünü bulmak için yüzlerce örnek sayfa olmalıdır.)

Tüm sunucunun yapması gereken, AJAX isteğini arama işlemini gerçekleştirerek ve yanıtı uygun şekilde biçimlendirerek yanıtlamaktır - bu çok daha kolay müşteri tarafı!

Yardım budur - herhangi bir örnek kodun bulunmadığı için üzgünüm, ancak bunun oldukça karıştığından şüpheleniyorum ve gerçekten bir JavaScript geliştiricisi değilim.

1

Rayların çoğunda olduğu gibi, bunu yapmanın birkaç yolu vardır. Raylar, bir dizi otomatik tamamlama yardımcılarını yerleşik olarak dahil ederdi, ancak bu işlev artık otomatik tamamlama eklentisine kaldırıldı. Bu, sizin istediğinizi elde etmenin en kolay yoludur - kontrol cihazında basit bir komut, görüşünüzde bazı basit şeyler. Bu çözümü kullanmak için sadece eklentiyi uygulamanıza yüklemeniz gerekecek - yüklü olması ve çalışmaya başlamak için bilmeniz gereken tüm bilgileri veren this page.

Başka bir cevapta belirtildiği gibi, bu rotaya gitme, Rails ile birlikte gelen prototip ve scriptaculous AJAX çerçevelerini kullanacaktır. Bu işlevselliği yerine getirmenize de yardımcı olabilecek JQuery başta olmak üzere başka AJAX çerçeveleri de vardır, ancak bunları eklenti ile devam etmekten daha fazla kullanmayı öğreneceksiniz.

1

Ayrıca

# your_view.rhtml 

<%= text_field 'contact', 'name', :id => 'suggest' %> 
<div id='dropdown' style='display:none; z-index: 100; background: #FFFFFF'></div> 

<script> 
    new Ajax.Autocompleter('suggest', 'dropdown', "<%= url_for :controller => 'contacts', :action => 'suggest_name' %>") 
</script> 

# contacts_controller.rb 

def suggest_name 
    query_string = params[:contact][:name] 
    @contacts = Contact.find.all :conditions => ['name ilike ?', "%#{query_string}%"] 
    render :partial => 'name_suggestions' 
end 

# contacts/_name_suggestions.rhtml 

<ul> 
<% for contact in @contacts %> 
    <li><%= contact.name %></li> 
<% end %> 
</ul> 
8

Raylar yapar bu biraz daha manuel yaklaşımdır deneyebilirsiniz gerçekten kolay text_field_with_auto_complete yöntemi kullanarak metin alanları üzerinde 'suggest' tarzı oto tamamlanması.

Raylarda 1.x bu yöntem ActionView::Helpers::JavaScriptMacrosHelper içine inşa edilmiş, ancak Raylar 2.x için a separate plugin taşındı.

Diyelim ki title adlı bir metin alanı vardır Post adında bir modeli var diyelim. Sizce, normal text_field_tag (veya f.text_field) kullanırsınız, tıpkı yerine text_field_with_auto_complete kullanın:

<%= text_field_with_auto_complete :post, :title %> 

Ayrıca, PostsController yılında, sen gelmiş karşılık gelen bir deklarasyon yapmak: Bu ne yapar

class PostsController < ApplicationController 
    auto_complete_for :post, :title 
end 

perde arkasında dinamik kontrolöre auto_complete_for_[object]_[method] denilen bir eylem eklemek edilir. Yukarıdaki örnekte bu eylem auto_complete_for_post_title çağrılır.

Bu otomatik olarak oluşturulan eylem tarafından kullanılan find çağrısının, tüm model nesneleri, ör. Post.find(:all, ...). Bu istediğiniz olmaması için (örneğin, eğer kullanıcı giriş yapmış dayalı Post s belirli bir alt kümesi için arama kısıtlama istiyorum) o zaman denetleyicisi kendi auto_complete_for_[object]_[method] eylemi tanımlamak zorunda.

İlgili konular