1

Daniel Kehoe のLearn Ruby on Railsの本に取り組んでいるときに、スプレッドシート接続のセクションにたどり着きました。Google ドライブの回避策を実行したところ、フラッシュ通知が送信されたというメッセージが表示されましたが、Google ドライブを確認すると、作成されたファイルが表示されません。

  • Learn-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です。

    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

サーバーをロードしてから連絡先フォームを送信しようとすると、

の認証に失敗しました: 投稿の応答コード 403 https://www.google.com/accounts/ClientLogin : 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'
4

1 に答える 1

0

私は同じエラーを抱えていましたが、POW を使用して開発サイトを提供していたことが問題でしたが、これが役立つ可能性があることに気付くために取った手順です。

  1. あなたがしたように、update_spreadsheet メソッドで変数をハードコーディングしたところ、これが機能しました。メソッドと google_drive gem が優れていることを証明しました。

  2. その後、Rails コンソールを起動し puts Rails.application.secrets.email_provider_username てメール アドレスを取得し、Rails が環境変数を認識できることを証明しました。

  3. 本の Rails 4.2 バージョンを 使用していgem 'web-console', '~> 2.0' て、フォームを投稿しようとしてエラーが発生したときに gem ファイルに追加したと仮定すると、コンソール プロンプトが表示されます。ここで私は puts Rails.application.secrets.email_provider_username 再び走りましたが、今回は答えとしてゼロになり、最初は混乱しました。

  4. これにより、独自の .powenv ファイルを使用するPOW ( http://pow.cx - 開発サイトを提供するための非常にクールな方法) を使用してサイトを提供していたため、変数にアクセスできないことに気付きました。rails serverlocalhost:3000 を実行して接続することでこれを確認し、問題なく投稿できました。

  5. そのため、.powenv に変数を追加して (.gitignore に追加して git からファイルを削除して)、問題を解決しました。

上記のトラブルシューティング手順のいくつかが私と同じように役立つことを願っており、チュートリアルを完了することができます.

于 2015-01-28T17:55:21.037 に答える