2011-05-19 2 views
43

अगर मैं रेल में एक RHTML ध्यान में रखते हुए हूँ, यह यूआरएल-भागने कुछ आसान है:मैं रेल में एक स्ट्रिंग को यूआरएल से कैसे बचूं?

<a href="/redirect?href=<%=u target %>">Foo</a> 

मैं एक स्ट्रिंग में ऐसा कैसे करते हैं? मैं ऐसा कुछ करना चाहता हूं:

<% redirect_href = "/redirect?#{url_escape target}&amp;foo=bar&amp;baz=some_other_stuff" -%> 
<a href="<%= redirect_href =>">Foo</a> 

यह छोटा होना चाहिए, है ना?

उत्तर

69

CGI.escape यह करना होगा:

<% redirect_href = "/redirect?#{CGI.escape target}&amp;foo=bar&amp;baz=some_other_stuff" -%> 
<a href="<%= redirect_href =>">Foo</a> 
+0

लिंक टूटी हुई है, rubybrain दूर चला गया है – Lambart

+1

CGI.escape से लिंक अब तय किया गया है –

+2

'CGI.escape' सबसे अच्छी बात नहीं है, क्योंकि यह अंतरिक्ष को '+' के रूप में एन्कोड करता है जिसे हटा दिया जाता है और हमेशा दूसरी तरफ सही ढंग से पार नहीं होता है। उदाहरण के लिए, यदि आपके पास रेल मार्ग "/ my-path /: query" है जहां क्वेरी में '+' शामिल है, तो यह रूट पार्सिंग के बाद '+' के रूप में रहेगा। इसे बेहतर काम करने के लिए, 'ईआरबी :: Util.u (स्ट्रिंग)' का उपयोग करें, जो अंतरिक्ष को "% 20" से बचता है। –

57

रेल (activesupport) को परिभाषित करता है Hash#to_param (Hash#to_query लिए उपनामित):

{foo: 'asd asdf', bar: '"<#$dfs'}.to_param 
# => "bar=%22%3C%23%24dfs&foo=asd+asdf" 

यह ध्यान देने योग्य है कि यह क्वेरी कुंजियों (HTTPS संचय के लिए) क्रमबद्ध करता लायक है।

Hash#to_param भी वैकल्पिक नाम स्थान पैरामीटर स्वीकार करता है:

{name: 'David', nationality: 'Danish'}.to_param('user') 
# => "user[name]=David&user[nationality]=Danish" 

http://api.rubyonrails.org/classes/Hash.html#method-i-to_param

+0

यह अब तक का सबसे आसान और साफ तरीका है। – Nikhil

25

ERB::Util.url_encode

कहीं से भी इस्तेमाल किया जा सकता, माणिक एसटीडी lib का हिस्सा है।

+0

यह एचटीएमएल से बचने के लिए है, यूआरएल से बचने के लिए नहीं। –

+0

thx @DaveJamesMiller उत्तर अपडेट किया गया –