Ruby on rails 在rails中需要全局对象时,如何避免常量?
我想将S3文件存储添加到我的rails 5应用程序中。因为我使用的是heroku,所以我使用了他们的方法,即在Ruby on rails 在rails中需要全局对象时,如何避免常量?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我想将S3文件存储添加到我的rails 5应用程序中。因为我使用的是heroku,所以我使用了他们的方法,即在config/initializers/aws.rb中创建一个名为S3_BUCKET的常量,您可以在任何地方使用该常量 heroku代码如下所示: #config/initializers/aws.rb S3_BUCKET=Aws::S3::Resource.new.BUCKET(ENV['S3_BUCKET']) 问题是我必须重写这个常量,才能使规范正常工作 我有另一种解决方案(遗憾
config/initializers/aws.rb
中创建一个名为S3_BUCKET
的常量,您可以在任何地方使用该常量
heroku代码如下所示:
#config/initializers/aws.rb
S3_BUCKET=Aws::S3::Resource.new.BUCKET(ENV['S3_BUCKET'])
问题是我必须重写这个常量,才能使规范正常工作
我有另一种解决方案(遗憾的是,它不起作用):
\lib/aws\u helpers/s3.rb
模块排架
模块S3
类此代码可能看起来很奇怪,但实际上它正是您在这种情况下想要的。请记住,这种情况有点不规则,它用于配置具有外部API依赖项和相关键的插件,这些键必须在其余代码工作之前填充
从实现的角度来看,这很难看,但从可用性的角度来看,这很好。您只需执行awsheppers::S3.configure do | config |
,如初始值设定项所示。所有这些代码都是为了使这些语义正常工作。这是一个廉价的技巧,但它是有效的
在config/application.rb
中:
module YourApp
class Application < Rails::Application
def s3_bucket
@s3_bucket ||= begin
# your stuff
end
end
end
end
Rails.application.s3_bucket.object(a_key)
moduleyourapp
类应用程序
为什么在初始值设定项中设置某些内容对您来说是错误的?您可以使用@my_变量设置类变量,但我强烈反对使用它。就我个人而言,如果应用程序的每个用户都使用相同的S3 bucket,我会在初始值设定项中进行设置。如果您需要不同用户的不同桶,您可以考虑使用会话存储,但我认为初始化器是正确的位置。是否需要详细说明使用初始值设定项进行测试时遇到的问题?在初始值设定项中定义全局常量在Rails中绝对可以。只要确保你没有变异它们,如果你发现自己定义的方式太多,也许会重新考虑你在做什么。如果您收到有关常数更改的警告,请仔细检查以确保没有设置它们。您还可以将.freeze
添加到任何常量中,以防止其发生变异。这可能就是你们的规格所抱怨的。我已经试图澄清我的问题。在初始化器中设置所有内容是我想要做的。我会喜欢的代码,我必须只是工作。我需要有一个存根对象来让规范工作。在这种情况下,代码就是我想要的。我很高兴你同意我的看法。问题是代码不起作用。
module YourApp
class Application < Rails::Application
def s3_bucket
@s3_bucket ||= begin
# your stuff
end
end
end
end
Rails.application.s3_bucket.object(a_key)