Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在rails中需要全局对象时,如何避免常量?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 在rails中需要全局对象时,如何避免常量?

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']) 问题是我必须重写这个常量,才能使规范正常工作 我有另一种解决方案(遗憾

我想将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'])
问题是我必须重写这个常量,才能使规范正常工作

我有另一种解决方案(遗憾的是,它不起作用):

\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)