我使用的是Rails 4.1.4、Mongoid4.0和ruby2.1.2p95。在我的控制器索引中,总是返回未定义方法`to_sym‘for nil:NilClass。数据库和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控制台中工作,但是在从控制器的索引操作调用时返回错误。
发布于 2014-07-22 20:11:05
结果发现问题在于我的mongoid.yml没有正确地选择通过rails 4.1 secrets.yml文件传入的数据库设置。
,所以在文件中,而不是在我的config/secils.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/secils.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 %>https://stackoverflow.com/questions/24874368
复制相似问题