rails NoMethodError:未定义的方法`helper_method' for ApplicationHelper:Module

时间:2015-04-27 23:16:08

标签: ruby-on-rails-4 google-api

我已遵循此tutorial并且其工作正常。

[以下答案后更新] 我已将代码移动到Application Controller(以前定义为帮助程序)以确定当前用户是否已登录

   class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  helper_method :current_user

  def current_user

    @current_user ||= User.find(session[:user_id]) if session[:user_id]

  end
end

我创建了一个模块来创建一个客户端对象并进行api调用,这个功能可能被一个或多个对象使用,所以将它创建为模块而不是控制器似乎是个好主意。

  require 'base64'
  require 'rubygems'
  require 'json'
  require 'google/api_client'
  require 'google/api_client/client_secrets'
  require 'net/https'
  require 'uri'

module GoogleClient

  include ApplicationController


  PLUS_LOGIN_SCOPE = 'https://www.googleapis.com/auth/plus.login'

  # Build the global client
  $credentials = Google::APIClient::ClientSecrets.load("#{Rails.root}/config/client_secret_xxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com.json")
  $authorization = Signet::OAuth2::Client.new(
    :authorization_uri => $credentials.authorization_uri,
    :token_credential_uri => $credentials.token_credential_uri,
    :client_id => $credentials.client_id,
    :client_secret => $credentials.client_secret,
    :redirect_uri => $credentials.redirect_uris.first,
    :scope => PLUS_LOGIN_SCOPE)
  $client = Google::APIClient.new(options = {:application_name => 'xxx-xxx-xxx'} )

  def GoogleClient.get_people

    if current_user

      # Authorize the client and construct a Google+ service.
      $client.authorization.update_token!(current_user.oauth_token.to_hash)
      plus = $client.discovered_api('plus', 'v1')

      # Get the list of people as JSON and return it.
      response = $client.execute!(plus.people.list,
        :collection => 'visible',
        :userId => 'me').body
      content_type :json
      puts response

    else

      redirect_to root_url

    end
  end
end

用户模型是;

require 'google_client'


class User < ActiveRecord::Base

  include GoogleClient

 # after_save GoogleClient.connect


  def self.from_omniauth(auth)

    where(provider: auth["provider"], uid: auth["uid"]).first_or_initialize.tap do |user|

      user.provider = auth.provider

      user.uid = auth.uid

      user.name = auth.info.name

      user.email = auth.info.email

      user.oauth_token = auth.credentials.token

      user.oauth_expires_at = Time.at(auth.credentials.expires_at)

      user.save!

    end

在控制台中测试结果

2.1.0:001&gt; GoogleClient.get_people NoMethodError:未定义的方法`helper_method&#39; for ApplicationHelper:Module

是否可以调用模块中的辅助方法?如果模块不正确,我应该如何实现此代码

**更新正确的模块代码,但api请求有一个重定向uri错误**在此post

中解释

&#34;请注意,/ lib中的模块不会自动加载。相反,您需要在config / application.rb文件文件配置块中添加此行:&#34;

config.autoload_paths += %W(#{config.root}/lib)

用户模型

class User < ActiveRecord::Base

  include Google::GoogleClient

  def self.from_omniauth(auth)

    where(provider: auth["provider"], uid: auth["uid"]).first_or_initialize.tap do |user|

      user.provider = auth.provider

      user.uid = auth.uid

      user.name = auth.info.name

      user.email = auth.info.email

      user.oauth_token = auth.credentials.token

      user.oauth_expires_at = Time.at(auth.credentials.expires_at)

      user.save!

    end
  end

  if current_user

    self.get_people()

  else

    redirect_to root_url

  end
end

&#39; LIB /谷歌/ google_client.rb&#39;

require 'google/api_client'
require 'google/api_client/client_secrets'
require 'google/api_client/auth/installed_app'

module Google

  module GoogleClient

    # Initialize the client.
    client = Google::APIClient.new(
      :application_name => 'xxx-xxx',
      :application_version => '1.0.0'
    )

    # Initialize Google+ API. Note this will make a request to the
    # discovery service every time, so be sure to use serialization
    # in your production code. Check the samples for more details.


    # Load client secrets from your client_secrets.json.
    client_secrets = Google::APIClient::ClientSecrets.load("#{Rails.root}/config/client_secret_XXXXXXXXXXXXXXXXXXXXXXXx.apps.googleusercontent.com.json")


    # Run installed application flow. Check the samples for a more
    # complete example that saves the credentials between runs.
    flow = Google::APIClient::InstalledAppFlow.new(
      :client_id => client_secrets.client_id,
      :client_secret => client_secrets.client_secret,
      :scope => ['https://www.googleapis.com/auth/plus.me']
    )
    client.authorization = flow.authorize

    def get_people

      # Make an API call.
      result = client.execute(
        :api_method => plus.activities.list,
        :parameters => {'collection' => 'public', 'userId' => 'me'}
      )

      puts result.data

    end
  end
end

1 个答案:

答案 0 :(得分:0)

将这两个移动到ApplicationController:

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

helper_method :current_user

这将为您提供一个适用于控制器,帮助器和视图的current_user方法。