Как Вы обрабатываете флэш-память направляющей с запросами Ajax?

Примечание: попытка получить свойство ошибки, отличной от объекта

Случается, когда вы пытаетесь получить доступ к объекту объекта, пока нет объекта.

Типичный пример для non-object notice будет

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

В этом случае $users представляет собой массив (а не объект), и он не имеет никаких свойств.

Это похоже для доступа к несуществующему индексу или ключу массива (см. Примечание: Undefined Index ).

Этот пример значительно упрощен. Чаще всего такое уведомление сигнализирует неконтролируемое возвращаемое значение, например. когда библиотека возвращает NULL, если объект не существует или просто неожиданное значение, отличное от объекта (например, в результате Xpath, структуры JSON с непредвиденным форматом, XML с неожиданным форматом и т. д.), но код не проверяет такой условие.

Поскольку эти не-объекты часто обрабатываются дальше, часто возникает фатальная ошибка при вызове метода объекта для не-объекта (см.: Неустранимая ошибка: вызов члену function ... на не-объекте ), останавливая скрипт.

Его можно легко предотвратить, проверив условия ошибки и / или переменную, соответствующую ожиданию. Здесь такое уведомление с примером DOMXPath:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Проблема заключается в доступе к свойству nodeValue первого поля, пока он не был проверен, существует ли он или нет в $result коллекция. Вместо этого он платит, чтобы сделать код более явным, назначив переменные объектам, на которых работает код:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if ($div) {
    $divText = $div->nodeValue;
}
echo $divText;

Связанные ошибки:

75
задан Stephen Horvath 29 March 2015 в 21:28
поделиться

5 ответов

Единственное улучшение, о котором я могу думать, делает значение по умолчанию страницы reload_flash (не имеющий необходимость поместить это на каждый rjs файл и сделать его expicit, если Вы не хотите перезагружать флэш-память, что-то как страница keep_flash.

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

0
ответ дан krusty.ar 24 November 2019 в 11:35
поделиться

Иначе было бы обновление/дисплей, отделение "уведомления" с сообщением от Вашего Ajax запрашивает обработчик "OnFailure". Это дает Вам способность показать эти сообщения "молния" с необходимым эффектом. Я использовал это

 render :text => "Some error happened", :status => 444

в Javascript

 new AjaxRequest(...

  ,
   OnFailure:function(transport) {
      $("#notice").update(transport.responseText);
     // show the message  
   }

);

HTH

1
ответ дан Rishav Rastogi 24 November 2019 в 11:35
поделиться

Это необходимо в js ответе

при использовании RSJ:

page.replace_html :notice, flash[:notice]
flash.discard

, Если Вы используете jQuery:

$("#flash_notice").html(<%=escape_javascript(flash.delete(:notice)) %>');
15
ответ дан Silviu Postavaru 24 November 2019 в 11:35
поделиться

Похож на то, в чем Вы нуждаетесь, flash.now[:notice], который только доступен в текущем действии а не в следующем. Можно смотреть на документацию здесь: http://api.rubyonrails.com/classes/ActionController/Flash/FlashHash.html#M000327

6
ответ дан nakajima 24 November 2019 в 11:35
поделиться

Вы также можете сохранять флэш-сообщения в заголовках ответов с помощью блока after_filter и отображать их с помощью javascript:

class ApplicationController < ActionController::Base
after_filter :flash_to_headers

def flash_to_headers
  return unless request.xhr?
  response.headers['X-Message'] = flash[:error]  unless flash[:error].blank?
  # repeat for other flash types...

  flash.discard  # don't want the flash to appear when you reload page
end

А в application.js добавить глобальный обработчик ajax. Для jquery сделайте что-то вроде этого:

$(document).ajaxError(function(event, request) {
  var msg = request.getResponseHeader('X-Message');
  if (msg) alert(msg);
});

Замените alert () своей собственной flash-функцией javascript или попробуйте jGrowl.

63
ответ дан 24 November 2019 в 11:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: