小编Joh*_*lly的帖子

如何根据当前的Rails环境设置回形针的存储机制?

我有一个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选项需要根据使用的存储系统而有所不同.

任何建议或建议将不胜感激!:-)

ruby-on-rails amazon-s3 paperclip

75
推荐指数
4
解决办法
2万
查看次数

nginx可以用作后端websocket服务器的反向代理吗?

我们正在开发一个需要利用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吗?

提前感谢任何建议或意见.:)

-约翰

reverse-proxy ruby-on-rails nginx thin websocket

35
推荐指数
5
解决办法
2万
查看次数

如何通过send_file发送文件后删除Sinatra中的文件?

我有一个简单的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作业?

ruby sinatra

12
推荐指数
1
解决办法
1433
查看次数

如何有效地使用Jasmine来测试通过Jammit打包的javascript资源?

我有一个使用Jammit组合javascript资源的rails应用程序,我想使用Jasmine进行我的javascript的BDD风格测试.我想知道是否有人有任何关于从Jasmine访问Jammit生成的'pacakges'的建议?

问题是Jasmine是通过在磁盘上定义要测试的JS文件列表来配置的,然后它将这些文件包含在自己的测试运行器页面中,该页面在浏览器中加载和运行.

我可以在jasmine.yml配置文件中使用Jammit打包之前引用每个JS文件...但是,Jammit已经在为我处理文件之间的依赖关系了,更重要的是,我还需要访问Jammit生成的已编译的javascript模板.

我也可以先手动运行Jammit来生成编译后的资产,然后再运行Jasmine,但我不得不在每次测试运行之前手动重新生成资产以测试更改,这会严重阻碍快速测试 - 驱动型工作流程.

我想知道我能否以某种方式:

  • 从Jasmine的机架服务器中安装Jammit控制器,以便它可以提供Jasmine的软件包?这基本上和Jammit在Rails的开发环境中已经完成的工作方式相同.
  • 在执行测试之前,以某种方式挂钩Jasmine以在每个页面加载上打包资产?这会慢一点,但会省去一步,确保事情是最新的.

有什么建议?我刚刚开始这样做,所以我可能会把它弄错.任何建议将不胜感激.:-)

谢谢!-约翰

javascript unit-testing ruby-on-rails jammit jasmine

7
推荐指数
1
解决办法
1313
查看次数

如何判断 ActiveRecord::Base.transaction 块何时提交?

后台作业和 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到不同的类中,这 …

ruby-on-rails rails-activerecord

5
推荐指数
1
解决办法
2555
查看次数