【问题标题】:Rails 4: Creating Google Calendar eventRails 4:创建谷歌日历事件
【发布时间】:2015-04-15 15:47:07
【问题描述】:

我正在尝试插入 Google 日历活动,如图所示 here。如果我发送带有硬编码值的请求,例如示例,它可以正常工作:

event = {'summary' => 'Summary',
         'location' => 'Location',
         'start' => { 'dateTime' => '2011-06-03T10:00:00.000-07:00' },
         'end' => { 'dateTime' => '2011-06-03T10:25:00.000-07:00' }}

但如果我尝试发送变量,它会静默失败:

event = {'summary' => "#{params[:summary]}",
         'location' => "#{params[:location]}",
         'start' => { 'dateTime' => "#{params[:start_time]}" },
         'end' => { 'dateTime' => "#{params[:start_time]}" }}

如果我这样格式化也会失败:

event = "{
          \"summary\": \"#{params[:summary]}\",
          \"location\": \"#{params[:location]}\",
          \"start\": { \"dateTime\": \"#{params[:start_time]}\" },
          \"end\": { \"dateTime\": \"#{params[:end_time]}\" }
        }"

我可以让它成功发布start_timeend_time 格式如下:Date.today.strftime("%Y-%m-%dT%l:%M:%S.000-07:00"),但这不太理想,因为我相信start_timeend_time 参数已经是@987654330 @对象。

表单正在传递参数,因为我在 Rails 控制台中得到了这个(为简洁起见,省略了authenticity_token):

Started POST "/events" for 127.0.0.1 at 2015-04-15 08:53:36 -0600
Processing by EventsController#create as HTML
  Parameters: {"utf8"=>"✓",
               "authenticity_token"=>"...",
               "event"=>{"summary"=>"Summary",
                         "start_time(1i)"=>"2015",
                         "start_time(2i)"=>"4",
                         "start_time(3i)"=>"15",
                         "start_time(4i)"=>"14",
                         "start_time(5i)"=>"54",
                         "end_time(1i)"=>"2015",
                         "end_time(2i)"=>"4",
                         "end_time(3i)"=>"15",
                         "end_time(4i)"=>"14",
                         "end_time(5i)"=>"55",
                         "location"=>"Location"},
               "commit"=>"Create Event"}

以下是相关代码:

client = Google::APIClient.new({:application_name => "PlannerApp",
                                :application_version => "1.0"})
client.authorization.access_token = t.fresh_token
service = client.discovered_api('calendar', 'v3')
client.execute(:api_method => service.events.insert,
               :parameters => {'calendarId' => 'primary'},
               :body => JSON.dump(event),
               :headers => {'Content-Type' => 'application/json'})

这是我从 Google 获得的信息(Authorization 为简洁起见省略):

Google::APIClient::Request Sending API request get https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest {
  "User-Agent"=>"PlannerApp/1.0 google-api-ruby-client/0.8.5 Mac OS X/10.10.2\n (gzip)",
  "Accept-Encoding"=>"gzip",
  "Content-Type"=>""}
Google::APIClient::Request Result: 200 {
  "expires"=>"Wed, 15 Apr 2015 14:58:37 GMT",
  "date"=>"Wed, 15 Apr 2015 14:53:37 GMT",
  "etag"=>"\"ye6orv2F-1npMW3u9suM3a7C5Bo/snCOExYvhrzEZTGzdubZtafuHVU\"",
  "vary"=>"Origin, X-Origin",
  "content-type"=>"application/json; charset=UTF-8",
  "x-content-type-options"=>"nosniff",
  "x-frame-options"=>"SAMEORIGIN",
  "x-xss-protection"=>"1; mode=block",
  "content-length"=>"93847",
  "server"=>"GSE",
  "cache-control"=>"public, max-age=300, must-revalidate, no-transform",
  "age"=>"0",
  "alternate-protocol"=>"443:quic,p=0.5",
  "connection"=>"close"}
Google::APIClient::Request Sending API request post https://www.googleapis.com/calendar/v3/calendars/primary/events {
  "User-Agent"=>"PlannerApp/1.0 google-api-ruby-client/0.8.5 Mac OS X/10.10.2\n (gzip)",
  "Content-Type"=>"application/json",
  "Accept-Encoding"=>"gzip",
  "Authorization"=>"Bearer ...",
  "Cache-Control"=>"no-store"}

我应该如何格式化这些 event 哈希值以获得成功的 POST

解决方案:

event = {'summary' => "#{params[:event][:summary]}",
         'location' => "#{params[:event][:location]}",
         'start' => { 'dateTime' => Time.new(params['event']['start_time(1i)'],
                                             params['event']['start_time(2i)'],
                                             params['event']['start_time(3i)'],
                                             params['event']['start_time(4i)'],
                                             params['event']['start_time(5i)'])
                                        .to_datetime.rfc3339,
                      'timeZone' => "America/Denver" },
         'end' => { 'dateTime' => Time.new(params['event']['end_time(1i)'],
                                           params['event']['end_time(2i)'],
                                           params['event']['end_time(3i)'],
                                           params['event']['end_time(4i)'],
                                           params['event']['end_time(5i)'])
                                      .to_datetime.rfc3339,
                    'timeZone' => "America/Denver" }}

【问题讨论】:

    标签: ruby-on-rails google-calendar-api google-api-client google-api-ruby-client


    【解决方案1】:

    您的参数是嵌套的。所以它会是:

    event = {'summary' => "#{params[:event][:summary]}",
         'location' => "#{params[:event][:location]}",
         'start' => { 'dateTime' => "#{params[:event][:start_time]}" },
         'end' => { 'dateTime' => "#{params[:event][:start_time]}" }}
    

    【讨论】:

    • 很好 - 谢谢!这解决了我关于字符串的部分问题(summarylocation),但不是针对时代(start_timeend_time)。你对这些有什么想法吗?它们是数据库和表单中的 time 字段。 "#{params[:event][:start_time]}" 不起作用,但根据参考 heredateTime 应该收到 datetime 值。我也尝试将'timeZone' => "America/Denver" 添加到startend 哈希中,但这也不起作用。
    • 根据您返回的参数,您必须建立它们。 Grrr...抱歉,提交得太早了。看看你是如何让你的约会变得零碎的?即"start_time(1i)"=>"2015", "start_time(2i)"=>"4", # your month "start_time(3i)"=>"15", "start_time(4i)"=>"14", # your day "start_time(5i)"=>"54", "end_time(1i)"=>"2015" # your year
    • 所以要获得年份片(年份),您可以使用"#{params[:event][:start_time(1i)]}"
    • 另外,当你让它工作时,你能标记这个答案和正确的分辨率吗?谢谢!
    • 太棒了!那是票。非常感谢。我会接受这个并用你的解决方案更新我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2015-01-14
    • 2013-06-26
    • 2018-05-10
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    相关资源
    最近更新 更多