小编Dan*_*n L的帖子

批量查找mongoDB记录(使用mongoid ruby​​适配器)

使用rails 3和mongoDB与mongoid适配器,如何批量查找到mongo DB?我需要获取特定mongo数据库集合中的所有记录,并在solr中索引它们(搜索数据的初始索引).

我遇到的问题是,做Model.all会抓取所有记录并将它们存储到内存中.然后当我处理它们并在solr中索引时,我的内存被吃掉了,进程就死了.

我要做的是在mongo中批量查找,这样我就可以一次迭代超过1,000条记录,将它们传递给solr进行索引,然后处理下一个1000等等...

我目前的代码是这样做的:

Model.all.each do |r|
  Sunspot.index(r)
end
Run Code Online (Sandbox Code Playgroud)

对于具有大约150万条记录的集合,这会占用8 GB以上的内存并导致该过程失败.在ActiveRecord中,有一个find_in_batches方法,允许我将查询分块为可管理的批处理,以防止内存失控.但是,我似乎无法为mongoDB/mongoid找到这样的东西.

我希望能够做到这样的事情:

Model.all.in_batches_of(1000) do |batch|
  Sunpot.index(batch)
end
Run Code Online (Sandbox Code Playgroud)

这样可以通过每次只进行一次可管理的问题集来缓解我的记忆问题和查询困难.但是,在mongoDB中进行批量查找时,文档很稀疏.我看到很多关于批量插入但没有批量查找的文档.

ruby-on-rails mongodb mongoid

39
推荐指数
3
解决办法
2万
查看次数

S3:没有'Access-Control-Allow-Origin'用于AJAX POST

这个问题让我有点疯狂.我正在尝试通过AJAX POST将文件上传到S3存储桶.

我的所有凭据都是正确的,因为当我执行正常的HTTP POST时,它会在S3存储桶中创建资源.但我真的想用进度条一次上传多个文件,因此我需要AJAX.

我的S3存储桶上有CORS设置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://localhost:3000</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

现在我只是想在我的开发环境中使用它(localhost:3000,使用标准的Rails 4.1).

根据我的理解,上面的CORS规则应该允许从localhost:3000到S3存储桶的AJAX请求.

但是,每次我通过AJAX提交文件时,都会收到以下错误:

XMLHttpRequest cannot load https://s3.amazonaws.com/<BUCKET>. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.
Run Code Online (Sandbox Code Playgroud)

这对我没有任何意义,因为localhost:3000 IS通过CORS规则被授予访问权限.

我还提供了一个我用来提交表单的JS片段:

  $.ajax({
    method: "POST",
    crossDomain: true,
    url: "https://s3.amazonaws.com/<BUCKET>",
    data: $(this).serialize() # Contains S3 necessary values
  })
Run Code Online (Sandbox Code Playgroud)

表单包含必要的Amazon S3密钥/ etc的输入.我知道它们有效,因为当我执行正常的HTTP POST时,它会在S3中正确创建资产.我所要做的就是AJAXify这个过程.

我错过了一些明显的东西吗?

使用:Rails 4.1,jquery-file-upload,雾宝石(适用于S3)

ajax amazon-s3 cors jquery-file-upload

16
推荐指数
1
解决办法
3228
查看次数

Rails 4,rspec 3:模型验证测试

我有一个organization具有属性的对象name, doing_business_as.我需要验证它name是不一样的doing_business_as.

# app/models/organization.rb
class Organization < ActiveRecord::Base
  validate :name_different_from_doing_business_as

  def name_different_from_doing_business_as
    if name == doing_business_as
      errors.add(:doing_business_as, "cannot be same as organization name")
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我有一个匹配的rspec文件来验证这个:

# spec/models/organization_spec.rb
require "rails_helper"

describe Organization do
  it "does not allow NAME and DOING_BUSINESS_AS to be the same" do
    organization = build(:organization, name: "same-name", doing_business_as: "same-name")

    expect(organization.errors[:doing_business_as].size).to eq(1)
  end
end
Run Code Online (Sandbox Code Playgroud)

然而,当我运行规范时,它失败了,这就是我得到的:

$ rspec spec/models/organization_spec.rb

Organization
  does not allow NAME and DOING_BUSINESS_AS to be …
Run Code Online (Sandbox Code Playgroud)

validation ruby-on-rails-4 rspec3

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

带有多个进度条的HTML5文件上传

我通过XmlHTTPRequest和HTML5上传多个文件.我上传工作正常,但我希望每个文件上传都有一个进度条.但是,我的代码使用最后一个进度条进行所有文件上传,而不是使用自己的进度条进行每次上传.所以这主要是客户端的视觉效果,但它真的很烦我.出于某种原因,我假设附加文件上传进度的事件会覆盖自己并使用最后一个进度条.这是我的代码:

var files = event.dataTransfer.files;

    // iterate over each file to upload, send a request, and attach progress event
    for (var i = 0, file; file = files[i]; i++) {
        var li = $("<li>" + file.name + "<div class='progressbar'></div></li>");

        // add the LI to the list of uploading files
        $("#uploads").append(li);

        // fade in the LI instead of just showing it
        li.hide().fadeIn();

        var xhr = new XMLHttpRequest();

            xhr.upload.addEventListener('progress', function(e) {
                var percent = parseInt(e.loaded / e.total * 100);
                li.find(".progressbar").width(percent);
            }, false); …
Run Code Online (Sandbox Code Playgroud)

html5 file-upload progress-bar

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

ZSH:执行脚本文件中的函数

我有一个~/scripts/git-workflow.sh如下所示的文件:

#!/bin/zsh

gp() {
  local cmd="git pull"
  echo "=> $cmd"
  $cmd
}
Run Code Online (Sandbox Code Playgroud)

它基本上是一个更好的别名,当我使用别名时,它会打印出命令,这样我就不会随着时间的推移忘记实际的命令。

在我的.zshrc档案中,我source ~/scripts/git-workflow.sh.

在我的 zsh 提示符下,当我执行时,$ gp它似乎运行了该函数,但失败了。

$ gp
=> git pull
gp:5: command not found: git pull
Run Code Online (Sandbox Code Playgroud)

但是,如果我$ git pull直接在命令行上执行,它运行得很好。

$ git pull
Already up to date.
Run Code Online (Sandbox Code Playgroud)

当我使用 时,这工作得很好bash,但我最近切换到zsh(感谢 Apple 使用它作为默认值)并且在执行我的脚本时遇到了问题。

是否需要某种特殊格式来放入我的函数,或者需要添加到 zsh 中才能使其工作?

bash shell zsh function

9
推荐指数
1
解决办法
1万
查看次数

Rails,ruby:SecureRandom.urlsafe_base64需要检查令牌的唯一性吗?

我需要为存储在我的数据库中的用户提供唯一的令牌.在我生成令牌的那一刻,我在使用它之前在DB中检查它的唯一性.这是我实际需要进行的测试还是我在浪费时间?

我已经查看了SecureRandomRuby 2.0.0 API,它没有说明我是否可以"信任"它的唯一性.

我知道没有任何随机值可以真正"独特",而且可能性有限.但是对于32位的十六进制值,我有信心在我的应用程序中再次遇到相同的值,但是想知道是否有人知道这种情况的"陷阱".

另一个考虑是使用,SecureRandom.uuid但基本上是相同的情况.

# usage
user.password_reset_token = Generator.unique_token_for_user(:password_reset_token)

# Performs DB query to ensure uniqueness
class Generator
  def self.unique_token_for_user(attribute)
    begin
      token = SecureRandom.urlsafe_base64(32)
    end while User.exists?(attribute => token)

    token
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby random unique ruby-on-rails-4

8
推荐指数
2
解决办法
2873
查看次数

Rails 4:为什么一种更快速渲染局部的方法呢?

我不确定这是否是Rails特定的问题,因此我也标记了它ruby.

event通过局部渲染记录集合.但是,我发现不同地渲染局部会导致性能差异剧烈.

两个版本都使用完全相同的数据,唯一改变的是用于渲染部分的代码.

为什么heck是一个版本始终比另一个版本快4倍?让我想知道我正在采取什么样的性能......

慢版(总请求时间950毫秒):

<% events.each do |event| %>
  <%= render partial: "events/event", locals: { event: event } %>
<% end %>

# Log output
Rendered events/_event.html.erb (1.1ms)
Rendered events/_event.html.erb (1.1ms) 
...
Run Code Online (Sandbox Code Playgroud)

更快的版本(总请求时间250毫秒):

<%= render partial: "events/event", collection: events, as: :event %>

# Log output
Rendered events/_event.html.erb (58.7ms)
Run Code Online (Sandbox Code Playgroud)

ruby performance partials ruby-on-rails-4

8
推荐指数
1
解决办法
1660
查看次数

Chrome 移动网络中的布局/视觉视口更改后,如何将标题保持在视觉视口的顶部?

我知道有多个关于此的问题,但由于浏览器团队自提出这些问题以来已经做出了更改,因此它们似乎都不再有效。我正在尝试找到这个问题的最新解决方案。

客观的

我的愿望是在使用移动网络浏览器时,特别是当用户将焦点放在输入字段并且显示虚拟键盘时,让固定标题保持静止在顶部,以获得类似应用程序的体验。

背景语境

最近,Chrome 移动团队更改了调整移动网络布局和视觉视口大小的方式,以便与 iOS 上的 Chrome 和 iOS 上的移动 Safari 保持一致。

David Fedor 的文章中的这个 GIF非常简洁地演示了大多数(但不是全部)移动浏览器的当前状态,即当显示屏幕键盘(OSK,又名虚拟键盘)时,视觉视口“向上移动”一个领域被聚焦。

我面临的最大问题是,当显示 OSK 时,我无法让标题元素在视觉上保持在顶部。当您的顶部应用栏具有“保存”等表单的主要操作时,这是一件大事。它使用户体验变得混乱,导致客户沮丧地离开,所以在我看来这并不是一件小事。

我已经尝试了 Chrome 团队推荐的 VisualViewport API,引用了 ,env(keyboard-inset-height)但它似乎不起作用,这让我觉得我在布局上做了一些奇怪的事情,导致 ENV 没有正确设置。

在此输入图像描述

我的代码

没什么太疯狂的,使用 CSS 网格来控制布局。

超文本标记语言

<html>
<body>
  <div id="container">
    <header id="header">header</header>
    <main id="main">
      main
      <input type="text" />
    </main>
    <footer id="footer">footer</footer>
  </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

CSS样式

body {
  margin: 0;
}

#container {
  height: 100dvh;
  display: grid;
  grid-template:
    "header" 50px
    "main" 1fr
    "footer" 50px
    "keyboard" env(keyboard-inset-height, 0px); // does not …
Run Code Online (Sandbox Code Playgroud)

css mobile mobile-safari mobile-website mobile-chrome

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

Rails 4'has_secure_password'验证空白密码,不能执行条件验证

我知道has_secure_password在:create action上添加了password和password_confirmation的验证.

创建新用户时,必须输入密码(和确认),否则用户无效.这是预期的行为,这很好.

如果要更新用户,可以更新选择属性,而无需提交密码/确认.这也很好,因为我可以在没有密码麻烦的情况下更新用户名.

但是,我遇到了一个我想更新用户密码的情况,我要求用户输入他们当前的密码,然后输入他们的新密码和确认.问题是当我只输入当前密码并提交表单时,它会通过所有验证.即使这可能是预期的行为,我认为这是一个非常糟糕的行为,因为密码不会更改为空值,即使它通过所有验证.如果我只是假设代码实际上执行的是"说",那么用户现在应该有一个空密码.

class User < ActiveRecord::Base
  # model has password_digest field
  has_secure_password

  # has_secure_password automatically adds the following...
  # validates :password, presence: true, on: [:create]

  validates :password, length: { minimum: 8 }
end

class SettingsController < ApplicationController
  # POSTed from form with fields :current_password, :new_password, :new_password_confirmation
  def update_password
    if current_user.authenticate(params[:current_password])
      if current_user.update_attributes(password: params[:new_password], password_confirmation: params[:new_password_confirmation])
        flash.now[:notice] = "Successfully updated Password"
      else
        # Problem with new password (do nothing)
        flash.now[:error] = "Invalid new password or confirmation (nothing changed)" …
Run Code Online (Sandbox Code Playgroud)

passwords validation bcrypt ruby-on-rails-4

6
推荐指数
1
解决办法
1387
查看次数

Rails 4 CarrierWave(母版)和MiniMagick:更改文件格式

我正在使用Rails 4.2,CarrierWave主分支和MiniMagick 4.3.6(还使用了CarrierWave :: MiniMagick模块)。

根据CarrierWave文档,可以在上载/处理阶段更改文件格式。

但是,我认为该代码无法像所记录的那样工作。我将Amazon S3与fog-awsgem 一起用作我的商店,并且上传到S3的文件仍保留其原始格式。

我的最终目标是上传PDF文档,并在将其保存在S3中时将其处理为png文件。

当我上传图像文件时,一切都按预期工作,它们作为图像正确进入S3。但是,PDF文件仍以“应用程序/ pdf”的内容类型存储在S3中,并且浏览器尝试将其呈现为PDF而不是图像(如果有用,我的上载将在图像滑块中使用)。

有人知道为什么转换过程无法正常进行吗?

模型(models / testimonial.rb):

class Testimonial < ActiveRecord::Base
  mount_uploader :image, TestimonialUploader
end
Run Code Online (Sandbox Code Playgroud)

上传器(uploaders / testimonial_uploader.rb):

class TestimonialUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  storage :fog

  process :convert_file_to_png => [850, 1100]

  def convert_file_to_png(width, height)
    manipulate! do |img|
      img.format("png") do |c|
        c.trim
        c.resize "#{width}x#{height}>"
        c.resize "#{width}x#{height}<"
      end

      img
    end
  end

  def extension_white_list
    %w(jpg jpeg png pdf bmp tif tiff)
  end

  def store_dir
    "testimonials/#{model.uuid}"
  end

  def filename
    super.chomp(File.extname(super)) + …
Run Code Online (Sandbox Code Playgroud)

carrierwave minimagick imagemagick-convert ruby-on-rails-4

6
推荐指数
0
解决办法
946
查看次数