Как я могу заставить рельсы отправлять в журнал ошибки javascript, а не оповещения?

Ошибки JavaScript в окне предупреждения травмируют мою душу. Есть ли способ отправить его на console.log() вместо alert()?


person Ryan Florence    schedule 18.08.2009    source источник
comment
для rjs попробуйте manageable.com/software/firebug_rjs_errors (ссылка почему-то не работает при встраивании)   -  person tliff    schedule 19.08.2009


Ответы (4)


Вы можете переопределить window.alert:

var oldAlert = window.alert; // reference to the original window.alert

window.alert = function(message) { 
  if (window.console && console.log) { 
    console.log(message); 
  } else { 
    oldAlert(message); // if console.log doesn't exist call window alert
  } 
} 
person Christian C. Salvadó    schedule 18.08.2009
comment
Это сработает, но это довольно жестоко, имхо. Но все же хорошее решение, так что +1 - person marcgg; 19.08.2009
comment
Решение на данный момент! Но я действительно хочу изучить этот плагин снизу - на всякий случай мне нужно использовать оповещение в приложении (чего я никогда не делаю, я считаю всплывающие окна практически в любой форме ненормативной лексикой) - person Ryan Florence; 19.08.2009
comment
если вы используете параметр: confirm в ссылках, он также будет использовать предупреждение - person tliff; 19.08.2009
comment
В JS подтверждение и предупреждение - разные вещи, хотя оба они волнуют. - person Ryan Florence; 19.08.2009

Да, console.log("error message goes here")

person Ryan Bigg    schedule 18.08.2009
comment
я думаю, он имел в виду предупреждения, которые генерирует rjs;) - person tliff; 19.08.2009
comment
Да, Rails многое делает сам по себе, полагаю, мне следует добавить тег rjs - person Ryan Florence; 19.08.2009

Это зависит от ошибки Javascript. Поскольку JavaScript интерпретируется клиентом, вам нужно будет отображать сообщения об ошибках на стороне клиента. Единственный реальный способ записать ошибки в файл журнала сервера - это если ошибка происходит на стороне сервера до того, как Javascript будет интерпретирован клиентом.

person mdinstuhl    schedule 18.08.2009
comment
Вы абсолютно правы, но console.log - это функция javascript для инструментов отладки браузера (инспектор webkit, firebug и новинка IE8), которую я пытаюсь использовать вместо предупреждения по умолчанию Rails (). - person Ryan Florence; 19.08.2009

Вы можете попробовать отключить отладку RJS в вашем файле environment.rb:

config.action_view.debug_rjs = false

Это должно полностью отключить предупреждения. Другой вариант - переопределить ActionView::Helpers::GeneratorMethods#to_s:

module ActionView
  module Helpers
    module GeneratorMethods
      def to_s #:nodoc:
        returning javascript = @lines * $/ do
          if ActionView::Base.debug_rjs
            source = javascript.dup
            javascript.replace "try {\n#{source}\n} catch (e) "
            javascript << "{ console.log('RJS error:\\n\\n' + e.toString()); console.log('#{source.gsub('\\','\0\0').gsub(/\r\n|\n|\r/, "\\n").gsub(/["']/) { |m| "\\#{m}" }}'); throw e }"
          end
        end
      end
    end
  end
end

Я признаю, что я не в своей глубине в том, чтобы переопределить метод, и я не знаю, рекомендуется ли это. Мне не нужно было делать ничего подобного в моих проектах.

Лично я предпочитаю не использовать RJS и использовать ненавязчивый jQuery.

person Andy Gaskell    schedule 19.08.2009
comment
Не уверен, насколько прототип более навязчив ... но в любом случае я собираюсь попробовать прототип / сценарий. Большинство вещей, которые я делаю, тяжелы для xhr, поэтому я хотел бы оставить их в семье, а не возиться с JS отдельно. Я сам занимаюсь mootools и уже вижу, что хочу его использовать. - person Ryan Florence; 19.08.2009
comment
Я уверен, что вы можете сделать прототип ненавязчивым, но это будет означать отказ от использования множества помощников AFAIK. Мне нравится писать и контролировать свой JS, поэтому он работает для меня. - person Andy Gaskell; 19.08.2009