Случается, когда вы пытаетесь получить доступ к объекту объекта, пока нет объекта.
Типичный пример для 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;
Связанные ошибки:
Единственное улучшение, о котором я могу думать, делает значение по умолчанию страницы reload_flash (не имеющий необходимость поместить это на каждый rjs файл и сделать его expicit, если Вы не хотите перезагружать флэш-память, что-то как страница keep_flash.
я не знал бы, где запустить, но знающий некоторые направляющие я уверен дело не в этом трудно.
Иначе было бы обновление/дисплей, отделение "уведомления" с сообщением от Вашего Ajax запрашивает обработчик "OnFailure". Это дает Вам способность показать эти сообщения "молния" с необходимым эффектом. Я использовал это
render :text => "Some error happened", :status => 444
в Javascript
new AjaxRequest(... , OnFailure:function(transport) { $("#notice").update(transport.responseText); // show the message } );
HTH
Это необходимо в js ответе
при использовании RSJ:
page.replace_html :notice, flash[:notice]
flash.discard
, Если Вы используете jQuery:
$("#flash_notice").html(<%=escape_javascript(flash.delete(:notice)) %>');
Похож на то, в чем Вы нуждаетесь, flash.now[:notice]
, который только доступен в текущем действии а не в следующем. Можно смотреть на документацию здесь: http://api.rubyonrails.com/classes/ActionController/Flash/FlashHash.html#M000327
Вы также можете сохранять флэш-сообщения в заголовках ответов с помощью блока 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.