【问题标题】:ruby/rails JSON to hash then changing array of the hashes then send back JSONruby/rails JSON 散列然后改变散列数组然后发回 JSON
【发布时间】:2016-01-03 23:43:59
【问题描述】:

我有一个 Rails 应用程序。我从 3rd 方 API 获得 JSON。我想修改它以便能够将正确的 JSON 发送到另一个 API。我能够使用 JSON.parse 对其进行哈希处理,但我无法正确修改哈希,并且我不知道将其转回 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

【问题讨论】:

    标签: ruby-on-rails arrays ruby json hash


    【解决方案1】:

    将 .each 更改为 .map 可能会解决您的问题,然后继续删除最后的 return formatted_result,因为您在 Ruby 中不需要它,因为它是您方法中的最后一件事,所以

    改变这个

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

    到这里

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

    【讨论】:

      【解决方案2】:

      如果您尝试填充新集合,请使用 map 而不是 each。所以,formatted_result = result.each do |event| 应该是 formatted_result = result.map do |event|

      【讨论】:

        猜你喜欢
        • 2016-10-17
        • 2012-03-22
        • 1970-01-01
        • 2014-08-02
        • 2011-05-01
        • 2020-02-03
        • 1970-01-01
        • 2017-01-18
        • 2022-01-06
        相关资源
        最近更新 更多