2015-04-04 3 views
1

Я новичок в Dashing (и относительно новичок в Ruby), поэтому заранее извиняюсь, если это глупый вопрос. В основном я пытаюсь заставить Dashing читать json-файл, который я обновляю каждые 10 секунд. Но я не могу заставить свою работу прочитать файл или опубликовать его в своем виджете List.Посещение листинга из внешнего файла JSON

Вот моя работа Код:

require 'rubygems' 
require 'json' 
require 'pp' 

name_list = Hash.new(0) 

SCHEDULER.every '10s' do 
    json = File.read('list.json') 
    response = JSON.parse(json) 
    name_list[people] = {label: response.keys, value: response.keys[]} 
    send_event('whosHere', { items: response.values }) 
end 

и мой JSON:

{ 
    "Mike": "Here", 
    "Jon": "Out", 
} 

И в случае, если вам нужно это мой код приборной панели:

<% content_for(:title) { "My super sweet dashboard" } %> 
<div class="gridster"> 
    <ul> 
    <li data-row="1" data-col="1" data-sizex="1" data-sizey="1"> 
     <div data-id="whosHere" data-view="List" data-title="Who's Home" style="background-color:#96bf48;"></div> 
    </li> 
    </ul> 
</div> 

ответ

0

Я вижу две проблемы:

1) Вы сена динь неверный объект:

response = JSON.parse(json) 
name_list[people] = {label: response.keys, value: response.keys[]} 
send_event('whosHere', { items: response.values }) 
  • name_list[people] Ваш результат предполагается обработать ваш JSON, но вы отправляете response.values вместо этого.

response Ваш обработанный объект JSON возвращен. Вы должны перебрать response построить массив объектов JSON, чтобы отправить в свой список:

# new empty array of persons each time job is run 
persons = [] 
# since your JSON file is single JSON object, using names for keys 
person_names = response.keys 
# for each name, do this 
person_names.each do |name| 
    # use the 'name' key to get the value (their status) 
    person_status = response[name] 
    # create new Hash/JSON object for each person 
    # use "label" and "value" keys for Dashing List widget 
    person = Hash.new("label",name,"value",person_status) 
    # add this new person object to your persons array 
    persons.push(person) 
end 

Обновлено Работа, которая отправляет persons массив Лихие вместо:

require 'rubygems' 
require 'json' 
require 'pp' 

name_list = Hash.new(0) 

SCHEDULER.every '10s' do 
    json = File.read('list.json') 
    response = JSON.parse(json) 

    persons = [] 
    person_names = response.keys 
    person_names.each do |name| 
     person_status = response[name] 
     person = Hash.new("label", name, "value", person_status) 
     persons.push(person) 
    end 

    send_event('whosHere', { items: persons }) 
end 

2) Ваш JSON ISN» t отформатирован правильно. Виджет «Список листинга» прослушивает массив объектов с ключами «label» и «value». Каждый человек будет индивидуальным объектом JSON, имя человека будет вашим значением «label», и их статус будет их «значением».

Вот список-элемент HTML из списка виджетов:

<li data-foreach-item="items"> 
    <span class="label" data-bind="item.label"></span> 
    <span class="value" data-bind="item.value"></span> 
    </li> 

Каждый элемент списка будет отображаться один объект JSON:

{ 
    "label":"Mike", 
    "value":"Here" 
} 

Так, чтобы отобразить Майк и Йона статусы в списке , вам понадобится массив, содержащий два объекта JSON:

[ 
    { 
     "label": "Mike", 
     "value": "Here" 
    }, 
    { 
     "label": "Jon", 
     "value": "Out" 
    } 
] 

Этот массив будет «значением», для вашего «элемента» в вашем объекте данных, который отправляется в ваш виджет «Избранное»:

{ 
    "items": [ 
     { 
      "label": "Mike", 
      "value": "Here" 
     }, 
     { 
      "label": "Jon", 
      "value": "Out" 
     } 
    ] 
} 
Смежные вопросы