ContactsController中的NoMethodError #create

时间:2015-01-06 15:04:13

标签: ruby-on-rails ruby google-sheets

我正在尝试制作一个功能性联系表单,用于在Google云端硬盘电子表格中存储数据。 当我测试应用程序并填写联系表单并按“提交”时,我收到此错误:

NoMethodError in ContactsController#create  
undefined method `login' for GoogleDrive:Module.

应用程序跟踪

app/models/contact.rb:16:in 'update_spreadsheet'  
app/controllers/contacts_controller.rb:10:in `create'

contact.rb

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 = GoogleDrive.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

class ContactsController < ApplicationController

  def new
    @contact = Contact.new
  end  

  def create
    @contact = Contact.new(secure_params)
    if @contact.valid?
            @contact.update_spreadsheet
      # TODO send message
      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

2 个答案:

答案 0 :(得分:0)

您需要使用:GoogleDrive.login_with_oauth

def update_spreadsheet

  connection = GoogleDrive.login_with_oauth(access_token)
  )
...

end

获取access_token

# Authorizes with OAuth and gets an access token.
client = Google::APIClient.new
auth = client.authorization
auth.client_id = "YOUR CLIENT ID"
auth.client_secret = "YOUR CLIENT SECRET"
auth.scope =
    "https://www.googleapis.com/auth/drive " +
    "https://spreadsheets.google.com/feeds/"
auth.redirect_uri = "urn:ietf:wg:oauth:2.0:oob"
print("1. Open this page:\n%s\n\n" % auth.authorization_uri)
print("2. Enter the authorization code shown in the page: ")
auth.code = $stdin.gets.chomp
auth.fetch_access_token!
access_token = auth.access_token

您可以制作第二种方法,例如

这是与您所面临的问题相关的摘录。

版1.0.0不是100%向后兼容0.3.x.一些方法已被删除。特别是,GoogleDrive.login已被删除,您必须使用GoogleDrive.login_with_oauth,如下面的示例代码所示。

在此处阅读更多内容:https://github.com/gimite/google-drive-ruby

更新:

您可以使用新类

实现新文件

或者只是在某处添加新方法:

def new_access_token
  client = Google::APIClient.new
  ... #excluded some code
  access_token = auth.access_token
  access_token # this line important, returning access_token
end

现在你可以调用pass,就像这样:connection = GoogleDrive.login_with_oauth(new_access_token)

如果要创建新类,请执行以下操作:

Class Token
  def new_access_token
  ...
  end
end

这样做可能更干净,现在你可以通过以下方式调用它:

token = Token.new
token.new_access_token

并将其传递给:

GoogleDrive.login_with_oauth(token.new_access_token)

由您决定使用哪种方法。

答案 1 :(得分:0)

在遵循Daniel Kehoe的Learn Rails一书的同时,我也遇到了这个问题。如果您查看GitHub repository for the project,他提供了一个简单的解决方法。具体做法是:

在文件 app / models / contact.rb

require "google_drive_v0"

连接变量:

connection = GoogleDriveV0.login(Rails.application.secrets.email_provider_username, Rails.application.secrets.email_provider_password)

已从本书更新。该文件的完整代码是:

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

这将允许您的代码使用旧方法运行,但您将在控制台中收到以下警告:

  

警告:不推荐使用GoogleDriveV0.login,我们会将其删除   下一个版本。请改用GoogleDriveV0.login_with_oauth。

要解决此问题,您可以按照其他海报中的有用信息进行操作。希望这有帮助!