Как я могу сказать Rails / HAML не экранировать URL? - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть этот код:

= link_to "unsubscribe instantly", "*|UNSUB|*".html_safe

, который генерирует этот HTML:

<a href="*%7CUNSUB%7C*">unsubscribe instantly</a>

| символы сбежали. Это не сработает, так как я отправляю этот HTML-код в службу, которая должна заменить *|UNSUB|* на URL-адрес отказа от подписки.

Вместо этого я хочу, чтобы Rails / HAML генерировал это:

<a href="*|UNSUB|*">unsubscribe instantly</a>

Я перешел на http://haml -lang.com / try.html и ввел %a{:href => "*|UNSUB|*"} unsubscribe, и результат оказался тем, что я ожидал. Так что я предполагаю, что это вещь Rails.


ОБНОВЛЕНИЕ : Я попробовал это на новом приложении Rails 3.1, и каналы не экранируются - это то, что я хотел. Что-то странное происходит с моим основным приложением rails, которое приводит к экранированию URL-адресов - теперь изучим его подробнее.


UPDATE : Я понял. У меня было какое-то промежуточное ПО Rack, которое работало примерно так:
content = Nokogiri(response)
# ... processing
return content.to_html

Это было кодирование материала внутри URL. Я задал связанный вопрос здесь: Предотвращение экранирования символов Nokogiri в URL

Ответы [ 5 ]

1 голос
/ 15 декабря 2011

Я понял это. У меня было некоторое промежуточное программное обеспечение Rack, которое работало примерно так:

content = Nokogiri(response)
# ... processing
return content.to_html

Это кодировало содержимое внутри URL.

1 голос
/ 15 декабря 2011

Они действительно сбежали? Я только что сделал тест с рельсами 3.0.3 (правка: и рельсы 3.1.1), с такими:

= link_to 'unsubscribe instantly', '*|UNSUB|*'   
%a{:href => '*|UNSUB|*'} unsubscribe instantly
:plain
  <a href="*|UNSUB|*">unsubscribe instantly</a>

тогда я использовал curl на странице, и кажется, что там есть труба, как:

curl http://localhost:3000/about | grep UNSUB
<a href="*|UNSUB|*">unsubscribe instantly</a>
<a href='*|UNSUB|*'>unsubscribe instantly</a>
<a href="*|UNSUB|*">unsubscribe instantly</a>
0 голосов
/ 14 декабря 2011

делает это за вас:

=! link_to "unsubscribe instantly", "*|UNSUB|*"

(осознайте, что это более или менее эквивалентно, но может иметь значение)

0 голосов
/ 14 декабря 2011

У меня нет места, чтобы проверить это, но будет ли это работать?

- html = "<a href="*|UNSUB|*">unsubscribe instantly</a>"
= raw html
0 голосов
/ 14 декабря 2011

Вы пытались пропустить link_to и просто создать тег ссылки непосредственно как

a{:href=>"*|UNSUB|*"} unsubscribe instantly
...