1

我正在使用 Rails 4.1.4、Mongoid 4.0 和 ruby​​ 2.1.2p95。从我的控制器索引中,总是为 nil:NilClass 返回未定义的方法 `to_sym'。数据库中有记录,并且从 rails 控制台运行相同的命令@email_templates = EmailTemplate.all.to_a将返回数据库中的所有记录。

这是控制器索引

 class EmailTemplatesController < ApplicationController

    def index
       @email_templates = EmailTemplate.all.to_a
    end
  end

模型的简化版本

  class EmailTemplate
   include Mongoid::Document
   field :name, type: String
   field :subject, type: String
   field :from, type: String
   field :to, type: String
   field :body, type: String
   field :template, type: BSON::Binary
  end

为什么这个@email_templates = EmailTemplate.all.to_a在rails 控制台中工作,但从控制器的索引操作调用时返回错误。

4

1 回答 1

0

原来问题在于我的 mongoid.yml 没有正确选择通过 rails 4.1 secrets.yml 文件传入的数据库设置。

所以而不是在我的 config/secrets.yml 文件中

  default: &mongodb
  mongodb_host: <%= ENV['TRG_MONGODB_HOST'] %>
  mongodb_host_port: <%= ENV['TRG_MONGODB_HOST_PORT'] %>
  mongodb_database: <%= ENV['TRG_MONGODB_DATABASE'] %>
  mongodb_db_username: <%= ENV['TRG_MONGODB_DB_USER'] %>
  mongodb_db_passowrd:  <%= ENV['TRG_MONGODB_DB_PASSWORD'] %>

  development:
    secret_key_base: xxxxxxxxyyyy
    <<: *mongodb

我们有这个,数据库设置键在 config/secrets.yml 文件中以符号为前缀,如下所示:

  default: &mongodb
  :mongodb_host: <%= ENV['TRG_MONGODB_HOST'] %>
  :mongodb_host_port: <%= ENV['TRG_MONGODB_HOST_PORT'] %>
  :mongodb_database: <%= ENV['TRG_MONGODB_DATABASE'] %>
  :mongodb_db_username: <%= ENV['TRG_MONGODB_DB_USER'] %>
  :mongodb_db_passowrd:  <%= ENV['TRG_MONGODB_DB_PASSWORD'] %>

如您所见,我通过使用错误的方式将配置从 secrets.yml 文件传递​​到 mongoid.yml 或 database.yml 文件。

 Rails.application.secrets.mongodb_db_username

而不是像这样使用嵌入式红宝石:

 <%= Rails.application.secrets.mongodb_db_username %>

mongoid.yml 中的最终 uri 现在看起来像这样:

 uri: mongodb://<%= Rails.application.secrets.mongodb_db_username %>:<%= Rails.application.secrets.mongodb_db_password %>@<%= Rails.application.secrets.mongodb_host %>:<%= Rails.application.secrets.mongodb_host_port %>/<%= Rails.application.secrets.mongodb_database %>
于 2014-07-22T20:11:05.693 回答