2016-01-03 3 views
1

У меня есть приложение для рельсов. Я получаю JSON от стороннего API. Я хотел бы изменить его, чтобы отправить JSON в другой API. Я смог сделать хэш этого с JSON.parse, но я не могу правильно изменить хеш, и я не знаю, какой предпочтительный способ вернуть его обратно JSON.ruby ​​/ rails JSON to hash, после чего меняет массив хэшей, а затем отправляет обратно JSON

В get_own_events method У меня есть result array (код работает правильно до этого). Теперь я пытаюсь извлечь некоторые атрибуты и вернуть новый массив formatted_result, который содержит только необходимые, отформатированные атрибуты (мне не нужен исходный массив результатов).

Как вернуть/создать надлежащее formatted_result array of hashes, а затем вернуть его обратно в JSON? В коде на данный момент я возвращаю исходный хеш не новый хеш, который я пытаюсь создать.

контроллер

@google = @user.socials.where(provider: "google_oauth2").first 
@results_own = get_own_events(@google) 
respond_to do |format| 
    format.html 
    format.json { render json: @results_own } 
end 

метод

def get_own_events(social_object) 
    client = init_google_api_calendar_client(social_object) 
    old_token = client.authorization.access_token 
    service = client.discovered_api('calendar', 'v3') 

    result_raw = client.execute(
    :api_method => service.events.list, 
    :parameters => { 'calendarId' => social_object.email, 
        'timeMin' => "2015-12-27T00:00:00+00:00", 
        'timeMax' => "2016-01-30T00:00:00+00:00" }, 
    :headers => {'Content-Type' => 'application/json'}) 

    result = JSON.parse(result_raw.body)['items'] 

    formatted_result = result.each do |event| 
    title = event['summary'] 
    if event['start']['dateTime'] 
     start_time = event['start']['dateTime'].to_datetime.rfc822 
    end 
    if event['end']['dateTime'] 
     end_time = event['end']['dateTime'].to_datetime.rfc822 
    end 
    if event['start']['date'] && event['end']['date'] && (event['start']['date'] != event['end']['date']) 
     all_day = true 
     start_allday_date = event['start']['date'].to_datetime.rfc822 
     end_allday_date = event['end']['date'].to_datetime.rfc822 
    end 
    formatted_event = {} 
    formatted_event['title'] = title 
    formatted_event['start'] = start_time || start_allday_date 
    formatted_event['end'] = end_time || end_allday_date 
    formatted_event['allDay'] = all_day || false 
    return formatted_event 
    end 

    return formatted_result 
end 

ответ

1

Изменение .each в .map может решить проблему вы и идти вперед и удалить return formatted_result в конце, как вам не нужно в Рубине, потому что это последняя вещь в вашем методе и так

изменить

formatted_result = result.each do |event| 
    ... 
    return formatted_event 
end 
return formatted_result 

к этому

result.map do |event| 
    ... 
    formatted_event 
end 
1

Если вы пытаетесь заполнить новую коллекцию, используйте map вместо each. Таким образом, formatted_result = result.each do |event| должен быть formatted_result = result.map do |event|.