Экранирование HTML-сущностей в URL-адресах rails remote_function - PullRequest
1 голос
/ 22 апреля 2009

Некоторое содержимое на моей странице загружается динамически с использованием этого кода:

javascript_tag( remote_function( :update => agenda_dom_id, :url => agenda_items_url(options), :method => :get ) )

Когда он выводится в браузере, он выглядит так:

new Ajax.Updater('agenda', 'http://localhost:3000/agenda_items?company=43841&history=true', {asynchronous:true, evalScripts:true, method:'get'})

Символ & в URL-адресе заменяется на &, поэтому второй параметр запроса отбрасывается.

Я провел разные тесты, и похоже, что Rails пытается преобразовать сущности HTML, как только обнаружит, что код находится в теге скрипта. И попытка жестко закодировать ссылку или тег javascript ничего не изменила.

Кто-нибудь сталкивался с этой проблемой раньше?

Ответы [ 5 ]

2 голосов
/ 19 октября 2009

Ребята, это просто поведение url_for по умолчанию в представлениях ... Да ладно, pass: escape => false вместе с параметрами URL и наслаждайтесь вещами без экранирования:)

1 голос
/ 22 апреля 2009

Все символы javascript экранированы (см. Источник remote_function). Это имеет некоторые последствия. Однако в вашем случае я не вижу никаких проблем, у меня есть подобные случаи, когда это просто работает.

Можете ли вы описать проблему, с которой вы столкнулись?

PS. Я отправил мне билет на маяк, потому что у меня есть случай, когда мне нужно вставить javascript: https://rails.lighthouseapp.com/projects/8994/tickets/2500-remote_function-does-not-allow-dynamically-generation-of-url#ticket-2500-2

0 голосов
/ 05 мая 2009

Используйте опцию: with (которая должна быть допустимой строкой запроса и не должна экранироваться как: url), например,

url, query_string = agenda_items_url(options).split('?')
javascript_tag( remote_function( :update => agenda_dom_id, :url => url, :with => query_string, :method => :get ) )

Я предполагаю, что calendar_items_url - ваша собственная вспомогательная функция, и она выводит полный URL-адрес, не экранируя его первым.

0 голосов
/ 23 апреля 2009

Я на Rails 2.3.2, и у меня нет проблем, когда & заменяется на & amp;

Если вам нужно исправить это в вашей ситуации, вы можете пропатчить обновление функции remote_ и добавить параметр: escape_ url и установить для него значение false. Поместите код ниже где-нибудь в вашей среде rails, где он загружается.

module ActionView
class Base
    def remote_function(options)
  javascript_options = options_for_ajax(options)

  update = ''
  if options[:update] && options[:update].is_a?(Hash)
    update  = []
    update << "success:'#{options[:update][:success]}'" if options[:update][:success]
    update << "failure:'#{options[:update][:failure]}'" if options[:update][:failure]
    update  = '{' + update.join(',') + '}'
  elsif options[:update]
    update << "'#{options[:update]}'"
  end

  function = update.empty? ?
    "new Ajax.Request(" :
    "new Ajax.Updater(#{update}, "

  url_options = options[:url]
  url_options = url_options.merge(:escape => false) if url_options.is_a?(Hash)
  function << (options[:escape_url] == false ? "'#{url_for(url_options)}'" : "'#{escape_javascript(url_for(url_options))}'") ## Add this line to the rails core
  function << ", #{javascript_options})"

  function = "#{options[:before]}; #{function}" if options[:before]
  function = "#{function}; #{options[:after]}"  if options[:after]
  function = "if (#{options[:condition]}) { #{function}; }" if options[:condition]
  function = "if (confirm('#{escape_javascript(options[:confirm])}')) { #{function}; }" if options[:confirm]

  return function
end 
end 

конец

0 голосов
/ 22 апреля 2009

Проблема с генерируемым URL:

http://localhost:3000/agenda_items?company=43841&amp;history=true

Параметр history не будет отправлен правильно, поскольку символ & заменен на &amp;.

Самое смешное, что когда я пробую это с link_to_remote вместо remote_link или когда я вывожу remote_function прямо на странице (а не в теге скрипта), это работает как положено символ & с его сущностью HTML.

Я на Rails 2.1.1 и Firefox. Возможно, это было исправлено в последней версии Rails, но переключение сейчас не вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...