电子表格连接部分,不会创建电子表格
Spreadsheet Connection section, won't create the spreadsheet
在编写 Daniel Kehoe 的 Learn Ruby on Rails 书时,我进入了电子表格连接部分。我遵循了 google 驱动器的解决方法,并收到了发送闪存通知的消息,但是当我检查 Google 驱动器时,我没有看到已创建的
学习-Rails-例子
电子表格。这是我的 models/contact.rb 文件。
require 'google_drive_v0'
class Contact
include ActiveModel::Model
attr_accessor :name, :string
attr_accessor :email, :string
attr_accessor :content, :string
validates_presence_of :name
validates_presence_of :email
validates_presence_of :content
validates_format_of :email, :with => /\A[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}\z/i
validates_length_of :content, :maximum => 500
def update_spreadsheet
connection = GoogleDriveV0.login(Rails.application.secrets.email_provider_username, Rails.application.secrets.email_provider_password)
ss = connection.spreadsheet_by_title('Learn-Rails-Example')
if ss.nil?
ss = connection.create_spreadsheet('Learn-Rails-Example')
end
ws = ss.worksheets[0]
last_row = 1 + ws.num_rows
ws[last_row, 1] = Time.new
ws[last_row, 2] = self.name
ws[last_row, 3] = self.email
ws[last_row, 4] = self.content
ws.save
end
end
这里是contacts_controller.rb,表明来自'Contacts'的消息应该发送到我的邮箱。
class ContactsController < ApplicationController
def new
@contact = Contact.new
end
def create
@contact = Contact.new(secure_params)
if @contact.valid?
@contact.update_spreadsheet
UserMailer.contact_email(@contact).deliver
flash[:notice] = "Message sent from #{@contact.name}."
redirect_to root_path
else
render :new
end
end
private
def secure_params
params.require(:contact).permit(:name, :email, :content)
end
end
当我加载服务器然后尝试提交联系表单时,我得到
身份验证失败:post https://www.google.com/accounts/ClientLogin 的响应代码 403:Error=BadAuthentication
然后在终端中:
WARNING: GoogleDriveV0.login is deprecated and will be removed in the next version. Use GoogleDriveV0.login_with_oauth instead. Completed 500 Internal Server Error in 153ms
google_drive (1.0.0) lib/google_drive_v0/session.rb:109:in `rescue in login'
google_drive (1.0.0) lib/google_drive_v0/session.rb:102:in `login'
google_drive (1.0.0) lib/google_drive_v0/session.rb:43:in `login'
google_drive (1.0.0) lib/google_drive_v0.rb:19:in `login'
...learn-rails/app/models/contact.rb:15:in `update_spreadsheet'
...learn-rails/app/controllers/contacts_controller.rb:10:in `create'
我遇到了同样的错误,虽然对我来说问题是我使用 POW 来为我的开发站点提供服务,但我为实现这一点而采取的步骤可能会对您有所帮助。
正如你所做的那样,我在 update_spreadsheet 方法中对变量进行了硬编码并且这有效 - 证明该方法和 google_drive gem 是好的。
然后我拉起 rails 控制台并做了
puts Rails.application.secrets.email_provider_username
这得到了我的电子邮件地址并证明 Rails 可以看到我的环境变量。
假设你在 Rails 4.2 版的书上并且添加了
gem 'web-console', '~> 2.0'
当您尝试 post 表单并收到错误时,您的 gem 文件应该会得到一个控制台提示。我在这里运行
puts Rails.application.secrets.email_provider_username
又一次,但这次得到了 nil 作为一开始让我感到困惑的答案。
这让我意识到我正在使用 POW(http://pow.cx - 一种非常酷的方式来为您的开发站点提供服务)为网站提供服务,它使用自己的 .powenv 文件等无法访问我的变量。我通过 运行 rails server
确认了这一点并通过 localhost:3000 连接并且我可以 post 没有问题。
所以将变量添加到 .powenv(并通过添加到 .gitignore 从 git 中删除文件)然后解决了问题。
希望上面的一些故障排除步骤可以像对我一样对您有所帮助,您可以完成本教程。
在编写 Daniel Kehoe 的 Learn Ruby on Rails 书时,我进入了电子表格连接部分。我遵循了 google 驱动器的解决方法,并收到了发送闪存通知的消息,但是当我检查 Google 驱动器时,我没有看到已创建的
学习-Rails-例子
电子表格。这是我的 models/contact.rb 文件。
require 'google_drive_v0' class Contact include ActiveModel::Model attr_accessor :name, :string attr_accessor :email, :string attr_accessor :content, :string validates_presence_of :name validates_presence_of :email validates_presence_of :content validates_format_of :email, :with => /\A[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}\z/i validates_length_of :content, :maximum => 500 def update_spreadsheet connection = GoogleDriveV0.login(Rails.application.secrets.email_provider_username, Rails.application.secrets.email_provider_password) ss = connection.spreadsheet_by_title('Learn-Rails-Example') if ss.nil? ss = connection.create_spreadsheet('Learn-Rails-Example') end ws = ss.worksheets[0] last_row = 1 + ws.num_rows ws[last_row, 1] = Time.new ws[last_row, 2] = self.name ws[last_row, 3] = self.email ws[last_row, 4] = self.content ws.save end end
这里是contacts_controller.rb,表明来自'Contacts'的消息应该发送到我的邮箱。
class ContactsController < ApplicationController
def new
@contact = Contact.new
end
def create
@contact = Contact.new(secure_params)
if @contact.valid?
@contact.update_spreadsheet
UserMailer.contact_email(@contact).deliver
flash[:notice] = "Message sent from #{@contact.name}."
redirect_to root_path
else
render :new
end
end
private
def secure_params
params.require(:contact).permit(:name, :email, :content)
end
end
当我加载服务器然后尝试提交联系表单时,我得到
身份验证失败:post https://www.google.com/accounts/ClientLogin 的响应代码 403:Error=BadAuthentication
然后在终端中:
WARNING: GoogleDriveV0.login is deprecated and will be removed in the next version. Use GoogleDriveV0.login_with_oauth instead. Completed 500 Internal Server Error in 153ms
google_drive (1.0.0) lib/google_drive_v0/session.rb:109:in `rescue in login'
google_drive (1.0.0) lib/google_drive_v0/session.rb:102:in `login'
google_drive (1.0.0) lib/google_drive_v0/session.rb:43:in `login'
google_drive (1.0.0) lib/google_drive_v0.rb:19:in `login'
...learn-rails/app/models/contact.rb:15:in `update_spreadsheet'
...learn-rails/app/controllers/contacts_controller.rb:10:in `create'
我遇到了同样的错误,虽然对我来说问题是我使用 POW 来为我的开发站点提供服务,但我为实现这一点而采取的步骤可能会对您有所帮助。
正如你所做的那样,我在 update_spreadsheet 方法中对变量进行了硬编码并且这有效 - 证明该方法和 google_drive gem 是好的。
然后我拉起 rails 控制台并做了
puts Rails.application.secrets.email_provider_username
这得到了我的电子邮件地址并证明 Rails 可以看到我的环境变量。假设你在 Rails 4.2 版的书上并且添加了
gem 'web-console', '~> 2.0'
当您尝试 post 表单并收到错误时,您的 gem 文件应该会得到一个控制台提示。我在这里运行puts Rails.application.secrets.email_provider_username
又一次,但这次得到了 nil 作为一开始让我感到困惑的答案。这让我意识到我正在使用 POW(http://pow.cx - 一种非常酷的方式来为您的开发站点提供服务)为网站提供服务,它使用自己的 .powenv 文件等无法访问我的变量。我通过 运行
rails server
确认了这一点并通过 localhost:3000 连接并且我可以 post 没有问题。所以将变量添加到 .powenv(并通过添加到 .gitignore 从 git 中删除文件)然后解决了问题。
希望上面的一些故障排除步骤可以像对我一样对您有所帮助,您可以完成本教程。