小编rea*_*not的帖子

ActionDispatch :: Http :: UploadedFile.content_type未在Rspec测试中初始化

背景:我有一个Book模型,其cover_file属性可以通过我的一个Rails控制器使用上传的文件进行设置.我正在使用Rails v4.0.4.

目标:我想测试只保存具有特定内容类型的文件.我计划使用ActionDispatch::Http:UploadedFile具有不同content_type属性的对象创建Rspec测试示例.

问题:当我ActionDispatch::Http::UploadedFile用a 初始化一个新的时content_type,它似乎没有被设置(参见下面的测试和输出确认它是零).似乎我只能在初始化UploadedFile之后用setter设置它.我在文档中没有看到任何提及这种行为,也没有在SO上找到类似的问答,所以我很感激任何人帮助确定我做错了什么.谢谢!

代码:

describe Book do
  let(:book) {FactoryGirl.build(:book)}
  describe "Save" do
    context "with valid data" do
      before do
        cover_image = File.new(Rails.root + 'spec/fixtures/images/cover_valid.jpg')
        book.cover_file = ActionDispatch::Http::UploadedFile.new(tempfile: cover_image, filename: File.basename(cover_image), content_type: "image/jpeg")
        puts book.cover_file.content_type.nil?
        book.cover_file.content_type = "image/jpeg"
        puts book.cover_file.content_type
      end
      specify{expect(book.save).to be_true}
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

输出:

true
image/jpeg
Run Code Online (Sandbox Code Playgroud)

ruby rspec ruby-on-rails multipartform-data ruby-on-rails-4

13
推荐指数
1
解决办法
9808
查看次数

Rails什么时候回应'transfer-encoding'和'content-length'?

我正在Rails版本4.1.7/Nginx上构建一个API,它响应来自iOS应用程序的请求.我们在客户端上看到了一些奇怪的缓存,我们认为它与Rails发送回的响应中的微小差异有关.我的问题......

1)我想理解为什么,对于完全相同的请求(只更改了Authorization标头值),Rails transfer-encoding: chunked有时Content-Length: <number>会发回?我认为它可能与响应大小有关,但在我下面粘贴了标题的示例响应中,正文中返回的数据完全相同.

2)有没有办法强迫它使用Content-Length?我们认为这将解决我们的iOS应用程序中的缓存问题.

回复#1

HTTP/1.1 200 OK
Cache-Control: max-age=0, private, must-revalidate
Content-Type: application/json; charset=utf-8
Date: Wed, 18 Mar 2015 00:59:31 GMT
ETag: "86f277ea63295460d4f3bed9a073eaa2"
Server: nginx/1.6.2
Status: 200 OK
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Request-Id: dd36f139-1986-4da6-9645-4438d41e74b0
X-Runtime: 0.123865
X-XSS-Protection: 1; mode=block
transfer-encoding: chunked
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)

请求#2

HTTP/1.1 200 OK
Cache-Control: max-age=0, private, must-revalidate
Content-Type: application/json; charset=utf-8
Date: Wed, 18 Mar 2015 00:59:36 GMT
ETag: "86f277ea63295460d4f3bed9a073eaa2"
Server: nginx/1.6.2
Status: 200 OK
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails nginx chunked-encoding content-length

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

AWS Lambda函数在context.fail之后继续一点

我有一个简单的AWS Lambda函数,可以对保存到S3存储桶的映像进行一些验证.我正在使用async.waterfall下载图像并对其进行处理,但在我输入第一个瀑布函数之前,我对从S3 PutObject触发器获取的事件数据做了一些基本验证,特别是大小信息(event.Records[0].s3.object.size) .如果事件引用的图像大于我的MAX_SIZE,我context.fail(new Error("Validation error: the file is too big."))用来结束执行.

这一切都运行正常,但我在日志中注意到,在记录错误后,该函数会在退出之前继续运行一段时间.例如,我的async.waterfall调用中的第一个函数被调用(即来自该函数的消息显示在日志中).我甚至尝试context.done(errorMessage)在context.fail之后立即添加一个,然后执行它(即我传入的消息被记录)以及几行代码.

这是预期的行为吗?我在文档中找不到任何提及.该函数是否需要一点时间退出,或者我是否误解了BEFORE中处理函数中代码的同步性async.waterfall

下面是我的一些代码.打印到日志console.log后显示的所有消息,context.fail我不希望发生.

exports.handler = function(event, context) {
  console.log('Received event:', JSON.stringify(event, null, 2));

  if (event.Records[0].s3.object.size > MAX_FILE_SIZE) {
    var error = new Error("Validation error: the file is too big.")
    context.fail(error);
  }
  console.log('Event validation complete.')

  var bucket = event.Records[0].s3.bucket.name;
  var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
  var fileName = key.split("/")[1];
  var params = {
    Bucket: bucket,
    Key: key
  }; …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services node.js aws-lambda

6
推荐指数
2
解决办法
8230
查看次数

Rails 需要环境配置文件中的语句

在我的config\environments\development.rbconfig\environments\production.rb文件中,我设置了一些全局变量。在下面的示例中,我有Redis一个指向我们的缓存的Statsd实例和一个指向 DataDog 代理的实例。

config.x.cache = Redis.new(url: ENV["CACHE"])  
config.x.statsd = Statsd.new('localhost', 8125)
Run Code Online (Sandbox Code Playgroud)

在 Redis 的情况下,我添加gem 'redis'到我的 gem 文件中,运行bundle install并且一切正常。然而,在 StatsD 的情况下,似乎我还需要require 'statsd'development.rbproduction.rb文件的顶部添加以便能够创建实例。当然,我也添加gem 'dogstatsd-ruby'到我的 gem 文件并运行了bundle install,但这似乎还不够。如果我不在require配置文件的顶部添加该语句,当我尝试运行我的 Rails 应用程序时,我会收到以下错误:

uninitialized constant Statsd (NameError)
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么我必须require只在这种特殊情况下(StatsD)添加语句,或者有更好的方法来做到这一点?谢谢!

ruby ruby-on-rails statsd datadog

5
推荐指数
0
解决办法
239
查看次数

如何使用Rails Action Controller嵌套参数来允许特定属性哈希

关于嵌套参数有很多问题,但我似乎无法找到解决我特定的简单情况的问题.

我正在尝试允许不是数组的嵌套哈希.我希望这可行:

params.require(:book).permit(:title, :description, style: {:font, :color})
Run Code Online (Sandbox Code Playgroud)

但它导致语法错误.

然而,这有效:

params.require(:book).permit(:title, :description, style: [:font, :color])
Run Code Online (Sandbox Code Playgroud)

但我的问题是,它似乎允许style值为具有属性的项目数组:font和:color.我只想允许具有这两个属性的单个哈希.

我尝试了其他变体,但我不断收到语法错误.我很感激任何帮助.

上下文:Rails 4.1.7,Ruby 2.0.0(它在我的todo列表中进行升级!),而不是使用ActiveRecord.

hash ruby-on-rails actioncontroller strong-parameters

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

如何在向Algolia发送部分对象更新时删除属性?

我需要使用partialUpdateObjectAlgolia Javascript SDK 从已经在索引中的对象中删除属性.

我的情况是description我的对象上有一个可选字段.如果用户最初设置描述然后删除它,我想从对象中完全删除描述.

我不想覆盖整个对象(没有description属性),因为我在对象上有一些我不想重新计算的计数属性.

据我所知,在文档中没有办法做到这一点,我的解决方法是将描述设置为空字符串.这是推荐的方法吗?

javascript algolia

3
推荐指数
1
解决办法
290
查看次数

Dynamodb检查主键和另一个字段的唯一性

我正在寻找解决我在当前DynamoDB应用程序设计中发现的问题的解决方案.

背景:我有一个Usersusername作为哈希键.其他属性包括email,password_digest和用户详细信息Name.我已经成立了一个全球二级索引称为EmailIndex具有email作为哈希和预测表的属性,它的一个子集.

我的用例:我需要确保属性usernameemail属性的唯一性.这很容易做到username因为它是哈希键.我假设在保存新用户之前,我可以查找以EmailIndex查看用户想要使用的电子邮件是否尚未使用,但我最近才意识到全局二级索引不支持强一致性读取.这样做的结果是,我将无法检测到两个用户使用相同的电子邮件地址几乎同时注册的情况.当我做了Query该请求EmailIndex在处理第二用户的要求,它会返回false和我的代码将假设电子邮件地址没有被抢走.但是,在后台,DynamoDB实际上正在处理PutItem包含相同电子邮件地址的第一个用户的请求.

目前,我正在朝更换标题EmailIndexUsersEmail表,做两次写入(一次为Users表和一到这个新表)为每个用户保存和更新,只是让我可以做一个查找username(从Users表)和email(从该UsersEmail表)为强一致性读取.还有其他我忽略的选择吗?

amazon-web-services amazon-dynamodb

2
推荐指数
1
解决办法
4055
查看次数