我有一个rails应用程序,它有多个带有回形针附件的模型,这些附件都上传到S3.这个应用程序还有一个经常运行的大型测试套件.这样做的缺点是每次测试运行都会将大量文件上传到我们的S3帐户,这使得测试套件运行缓慢.它还会降低开发速度,并要求您具有Internet连接以便处理代码.
有没有合理的方法来设置基于Rails环境的回形针存储机制?理想情况下,我们的测试和开发环境将使用本地文件系统存储,生产环境将使用S3存储.
我还想将这个逻辑提取到某种共享模块中,因为我们有几个需要这种行为的模型.我想在每个模型中避免这样的解决方案:
### We don't want to do this in our models...
if Rails.env.production?
has_attached_file :image, :styles => {...},
:path => "images/:uuid_partition/:uuid/:style.:extension",
:storage => :s3,
:url => ':s3_authenticated_url', # generates an expiring url
:s3_credentials => File.join(Rails.root, 'config', 's3.yml'),
:s3_permissions => 'private',
:s3_protocol => 'https'
else
has_attached_file :image, :styles => {...},
:storage => :filesystem
# Default :path and :url should be used for dev/test envs.
end
Run Code Online (Sandbox Code Playgroud)
更新:粘性部分是附件:path和:url选项需要根据使用的存储系统而有所不同.
任何建议或建议将不胜感激!:-)
我们正在开发一个需要利用html5 websockets的Ruby on Rails应用程序.目前,我们有两个单独的"服务器"可以这么说:我们主要应用上的nginx +客运运行,并使用PRATIK奈克的一个单独的服务器抽筋框架(这是上运行薄)来处理WebSocket连接.
理想的情况是,当谈到时间进行部署,我们不得不对nginx的+乘客运行Rails应用程序,和WebSocket的服务器将背后nginx的被代理,所以我们不会需要有一个不同的端口上运行的WebSocket伺服器.
问题是,在这种设置中,似乎nginx过早地关闭了与Thin的连接.已成功建立与瘦服务器的连接,然后立即关闭200响应代码.我们的猜测是nginx没有意识到客户端正试图为websocket流量建立一个长期运行的连接.
不可否认,我对nginx配置并不是那么精明,所以,甚至可以配置nginx作为websocket服务器的反向代理吗?或者我是否必须等待nginx为新的websocket握手提供支持?假设让app服务器和websocket服务器都在端口80上监听是一个要求,那么这可能意味着我必须在没有nginx的单独服务器上运行Thin吗?
提前感谢任何建议或意见.:)
-约翰
我有一个简单的sinatra应用程序需要生成一个文件(通过外部进程),将该文件发送到浏览器,最后从文件系统中删除该文件.这些方面的东西:
class MyApp < Sinatra::Base
get '/generate-file' do
# calls out to an external process,
# and returns the path to the generated file
file_path = generate_the_file()
# send the file to the browser
send_file(file_path)
# remove the generated file, so we don't
# completely fill up the filesystem.
File.delete(file_path)
# File.delete is never called.
end
end
Run Code Online (Sandbox Code Playgroud)
但是,似乎send_file调用完成了请求,并且它之后的任何代码都没有运行.
有没有办法确保生成的文件在成功发送到浏览器后被清除?或者我是否需要在某个时间间隔内使用运行清理脚本的cron作业?
我有一个使用Jammit组合javascript资源的rails应用程序,我想使用Jasmine进行我的javascript的BDD风格测试.我想知道是否有人有任何关于从Jasmine访问Jammit生成的'pacakges'的建议?
问题是Jasmine是通过在磁盘上定义要测试的JS文件列表来配置的,然后它将这些文件包含在自己的测试运行器页面中,该页面在浏览器中加载和运行.
我可以在jasmine.yml配置文件中使用Jammit打包之前引用每个JS文件...但是,Jammit已经在为我处理文件之间的依赖关系了,更重要的是,我还需要访问Jammit生成的已编译的javascript模板.
我也可以先手动运行Jammit来生成编译后的资产,然后再运行Jasmine,但我不得不在每次测试运行之前手动重新生成资产以测试更改,这会严重阻碍快速测试 - 驱动型工作流程.
我想知道我能否以某种方式:
有什么建议?我刚刚开始这样做,所以我可能会把它弄错.任何建议将不胜感激.:-)
谢谢!-约翰
后台作业和 ActiveRecord 的一个常见问题是作业在所需模型提交到数据库之前排队并执行。
ActiveRecord 模型有一个很好的after_commit回调,可用于特定模型。
但是,假设您有一些涉及几个不同模型的业务逻辑,将这些逻辑塞进单个模型中是不合适的。因此,您编写某种服务/命令对象来执行事务块内的逻辑:
例如,类似于以下内容:
class SomeServiceObject
def execute
thing = create_thing_in_a_tx
# this notification often fires before the above transaction commits.
notify_user(thing)
end
private
def create_thing_in_a_tx
ActiveRecord::Base.transaction do
a = ModelA.new(foo: 'bar')
b = ModelB.new(a_record: a, biz: 'baz')
#... various other logic that doesn't really belong in a model ...
ThingModel.create!(b_record: b)
end
end
def notify_user(thing)
EnqueueJob.process_asyc(thing.id)
end
end
Run Code Online (Sandbox Code Playgroud)
在这种情况下,据我所知,您实际上无法访问方便的after_commit回调。
我想在上面的示例中,您可以ThingModel将作业排入其after_commit回调中,但是随后您将应承担的责任分散SomeServiceObject到不同的类中,这 …