Ruby PG gem连接问题

时间:2016-09-03 17:41:57

标签: ruby postgresql sinatra

我已经搜索了几个相关的帖子,因为我遇到了但无法找到答案的问题。我是一名编程程序的学生,其中大多数人使用Mac,但我使用的是Windows(7,Pro,64) - 因为我已经锁定了工具/软件我&# 39;将在这里发布。

我试图通过Ruby使用pg gem打开连接,并且我正在使用Sinatra和PostgreSQL。我已经为PostgreSQL建立了服务器,数据库和配置路径变量,并且我已经成功安装了pg gem(在其他一些帖子中没有问题):

gem install pg -- --with-pg-config=C:\Program Files\PostgreSQL\9.5\bin

所以问题是当我启动Sinatra并转到localhost时, 我得到一个NoMethodError,未定义的方法为nil:NilClass的方法,否则适用于Mac用户。

方法是:

configure :development do
  set :db_config, { dbname: "news_aggregator_development" }
end

configure :test do
  set :db_config, { dbname: "news_aggregator_test" }
end

def db_connection
  begin
    connection = PG.connect(Sinatra::Application.db_config)
    yield(connection)
  ensure
    connection.close
  end
end

get '/articles' do
  @results = db_connection do |conn|
    conn.exec("SELECT * FROM articles")
  end
  erb :index
end

connection返回nil,因此close方法返回未定义的方法错误。我并不认为存在语法错误,因为我已与其他人就此进行了检查,并且我认为它可能与pg的连接错误有关。

第一次发帖所以请放轻松我=)如果我遗漏了任何所需信息,请致歉 - 让我知道更多上下文可能会有所帮助,我会尽力提供!谢谢!

1 个答案:

答案 0 :(得分:0)

两点:

  1. 将您的Sinatra助手包裹在helpers {}区块中。这样您就可以使用settings.db_config代替Sinatra::Application.db_config

    helpers do
      def db_connection
        connection = PG.connect(settings.db_config)
        yield connection
      ensure
        connection.close
      end
    end
    
  2. PG.connect调用中,您应该传递主机,用户,密码以及pg gem查找,连接和验证实例所需的任何其他选项。仅dbname是不够的 - 至少在Windows上不行。

    configure :development do
      set :db_config, {
        host: "localhost",
        port: 5432, 
        user: "foo",
        password: "bar",
        dbname: "news_aggregator_development"
      }
    end
    
  3. 祝你好运!