RoR - NoMethodError in ContactsController



我正在学习RailsApps的Learn Ruby on Rails教程,第22章"SPREADSHEET CONNECTION"。

在完成了书和数字显示的所有操作后,我得到了这个错误

NoMethodError in ContactsController#create undefined method `new' for
#<String:0x00000004fe5778> Extracted source (around line #19): 17 18 19 20 21 22
    connection = GoogleDriveV0.login_with_oauth(Rails.application.secrets.email_provider_username, Rails.application.secrets.email_provider_password )
    ss = connection.spreadsheet_by_title('Aprendo')
    if ss.nil?
      ss = connection.create_spreadsheet('Aprendo')
    end
Rails.root: /home/action/workspace/aprendo
app/models/contact.rb:19:in `update_spreadsheet' app/controllers/contacts_controller.rb:10:in `create'

我不知道会是什么。

我的联系人.rb:

equire "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_with_oauth(Rails.application.secrets.email_provider_username, Rails.application.secrets.email_provider_password
)
    ss = connection.spreadsheet_by_title('Aprendo')
    if ss.nil?
      ss = connection.create_spreadsheet('Aprendo')
    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

我的联系人_控制器:

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

正如书中git所说,我更改了secrets.yml,但这对没有帮助

您需要使用: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%snn" % 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

你可以制作第二种方法,比如

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

Ver。1.0.0与0.3.x不是100%向后兼容。一些方法已被删除。特别是,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)

相关内容

  • 没有找到相关文章

最新更新