2010-12-09 15 views
11

Bu nedenle, bir özelliğe sahip olanlar dahil olmak üzere özel karakterler içeren URL'ler oluşturmak için bir Rails URL yardımcısı (page_url) kullanmaya çalışıyorum.Raylar url yardımcısı ve işaretlerini kodlamadı

(rdb:1) page_url('foo', :host => 'host') 
"http://host/pages/foo" 
(rdb:1) page_url('foo_%_bar', :host => 'host') 
"http://host/pages/foo_%25_bar" 

Ama bazı garip nedenle, ampersanlar çıkışı yapılmaz:

(rdb:1) page_url('foo_&_bar', :host => 'host') 
"http://host/pages/foo_&_bar" 

Ve onları-kaçış önceden, onlar bozuk olsun: Vakaların çoğu sen onları beklediğiniz gibi çalışır

(rdb:1) page_url('foo_%26_bar', :host => 'host') 
"http://host/pages/foo_%2526_bar" 

CGI::escape , diğer taraftan, ince kaçırmaz:

(rdb:1) CGI::escape('foo_&_bar') 
"foo_%26_bar" 

Neler oluyor, bu konuda nasıl çalışıyorum? (gsub('&', '%26')'dan daha güzel bir şeyle, yani.)

+0

Hmmm .. Gerçekten, özellikle page_url (apidock web sitesine bakın) denilen bir ray yardımcısı bulamıyorum - doğru yöntem adının bu olduğundan emin misiniz? Bunun yerine url_for mu demek istediniz? –

+0

"page" adlı bir ActiveRecord'um var, _url yardımcısı automagically oluşturuldu. – jpatokal

+0

Ah - sağ. Bu açıklamanızdan kaynaklanmadı :) –

cevap

14

Size bununla başa çıkmak için güzel bir yol söyleyemem - ama neden olduğunu açıklayabiliyorum.

İşaretler ve URL'ler için geçersiz karakterler geçersizdir. Aksi takdirde: "http://host/pages/foo?bar=baz&style=foo_style" ile ilgili sorunlarınız ya da her neyse.

Düzenleme: Kaynak kodun daha derinine inmek, Rails'in yalnızca parametreler üzerinde CGI.escape'i kullanıyor gibi görünüyor. Sonunda derin kaynak kodunun sprivate-yöntemlerinde şeyler çağırır ... ama http://apidock.com/rails/ActionController/Routing/Route/generate CGI.escape (çağırarak biter:

yardımcı, url-jeneratörler sonunda çağırır (kapakların altında) url_for kullanmak ilk önce actionpack/lib/action_controller/yönlendirme/route.rb dosyasına bakın, ardından actionpack/lib/action_controller/yönlendirme/segmentler.rb'de

Sonuç, url'nin kendisinde rayların URI.escape'i kullanmasıdır. Hepsini kapa Belirtiler (Bu bağlantı, bir kısmı veya tamamı İngilizce olan içeriğe işaret edebilir.) (Bu bağlantı, bir kısmı veya tamamı İngilizce olan içeriğe işaret edebilir.) Şu anda bu konuda yapabileceğiniz hiçbir şey, raylar ekibine gerçek bir özellik talebi koymadan yapabiliyorsunuz.

... sen her zaman tüm URL'ler için kendinizi onları gsub olabilir URL'lerinizdeki ve işaretleri kullanmamayı tercih seçeneğine sahip olmadıkça: Sadece bir şey kodlamak için çalışıyoruz herkes için

def my_clean_url(the_url) 
    return the_url.gsub(/&/,'_') 
end 
>> my_clean_url('/my_foo_&_bar') 
=> "/my_foo___bar" 

page_url(my_clean_url('/my_foo_&_bar')) 
+1

Sorun, altta yatan (Ruby olmayan) uygulama tarafından normal bir karakter olarak kullanıldığı, ancak birçok URL ayrıştırıcısının onu bir parametre sınırlayıcısı olarak gördüğü ve URL'yi gördüklerinde URL'yi kestiği. Kodlamak, sağlam kalmasını sağlar. – jpatokal

+0

Ah yup - bu mantıklı. –

+0

Dedektiflik için teşekkürler! – jpatokal

6

az, AZ, 0-9 ve altçizgi hariç:

URI.encode(string, /\W/) 

Örneğin, Ve işaretleri ve bu içeriği mailto bağlantı için body parametresi olarak kullanmak istiyorsunuz: /\W/ olmadan, (ve güvenli bir URI karakter olan) ampersand kodlanmayacak ve bu nedenle bağlantıyı kısmen kesecektir.

İlgili konular