Rails Active Admin中初始化BigQuery对象报错:undefined method `new'
解决Active Admin中Google Cloud BigQuery初始化错误:
undefined method 'new' for Google::Cloud::Bigquery:Module 错误原因
你使用的google-cloud-bigquery 0.20.1是一个较早的版本,该版本的API设计和后续新版本存在差异——Google::Cloud::Bigquery模块并没有提供new方法来初始化客户端实例,正确的初始化入口是Google::Cloud.bigquery这个顶层方法。
修改后的代码
以下是调整后的Active Admin资源代码,重点修正了BigQuery客户端的初始化逻辑:
ActiveAdmin.register BabyName do require 'google/cloud/bigquery' permit_params :name, :gender controller do def create if baby_name = BabyName.create(name: permitted_params[:baby_name][:name], gender: permitted_params[:baby_name][:gender]) # 用Rails.root确保密钥文件路径正确,避免相对路径导致的文件找不到问题 keyfile = Rails.root.join('123.json') creds = Google::Cloud::Bigquery::Credentials.new(keyfile) # 替换原有的Google::Cloud::Bigquery.new为Google::Cloud.bigquery方法 bigquery = Google::Cloud.bigquery( project_id: 'myproject', credentials: creds ) p bigquery.project_id #=> 'my-project' dataset = bigquery.create_dataset 'baby' table = dataset.create_table 'baby_names' do |schema| schema.string 'name', mode: :required schema.string 'gender', mode: :required schema.integer 'count', mode: :required end # 同样用Rails.root处理数据文件路径 file = File.open(Rails.root.join('names/yob2014.txt')) table.load file, format: 'csv' redirect_to admin_baby_name_path(baby_name.id), notice: 'Baby Name saved successfully!!' else render 'new' end end end end
额外注意事项
- 确保
123.json密钥文件和names/yob2014.txt数据文件的路径正确,使用Rails.root.join可以避免不同环境下相对路径不一致的问题。 - 如果后续计划升级
google-cloud-bigquery到1.x及以上版本,就可以改用Google::Cloud::Bigquery.new的初始化方式,但升级时需要留意API的其他兼容变化。
内容的提问来源于stack exchange,提问作者Amal
相关产品推荐
相关产品推荐

