小编ele*_*nts的帖子

Rails用于集合对象的模型类方法

我在编写用于ActiveRecord对象集合的类方法时遇到了麻烦.我在最近几个小时内遇到过这个问题两次,这似乎是一个简单的问题,所以我知道我错过了一些东西,但我无法在其他地方找到答案.

例:

class Order < ActiveRecord::Base

  belongs_to :customer

  scope :month, -> { where('order_date > ?', DateTime.now.beginning_of_month.utc) }

  def self.first_order_count
    map(&:first_for_customer?).count(true)
  end

  def first_for_customer?
    self == customer.orders.first
    # this self == bit seems awkward, but that's a separate question...
  end

end
Run Code Online (Sandbox Code Playgroud)

如果我打电话Order.month.first_order_count,我会 NoMethodError: undefined method 'map' for #<Class:...

据我所知,那是因为map不能直接调用Order,而是需要一个Enumerable对象.如果我打电话Order.year.map(&:first_for_customer?).count(true),我会得到理想的结果.

编写用于ActiveRecord对象集合的方法的正确方法是什么,而不是直接在类上?

ruby activerecord ruby-on-rails

11
推荐指数
2
解决办法
6495
查看次数

独角兽工人无故死亡

所有的独角兽工人都在默默地死去,没有任何原因的迹象,而且我找不到任何外部过程杀死他们的证据。我是刚开始诊断这类问题的人,经过数小时的研究,实验并试图弄清楚这一点,我已经走到了尽头。

背景信息-它是一个Rails 4.1应用程序,Ruby 2.0,在Ubuntu 14.04服务器上运行nginx和unicorn。

独角兽

working_directory "/home/deployer/apps/ourapp/current"
pid "/home/deployer/apps/ourapp/current/tmp/pids/unicorn.pid"
stderr_path "/home/deployer/apps/ourapp/current/log/unicorn.log"
stdout_path "/home/deployer/apps/ourapp/current/log/unicorn.log"

listen "/tmp/unicorn.ourapp.sock"
worker_processes 2
timeout 30
Run Code Online (Sandbox Code Playgroud)

摘自unicorn.log(死前和重启后的最后几行)

I, [2016-08-28T19:54:01.685757 #19559]  INFO -- : worker=1 ready
I, [2016-08-28T19:54:01.817464 #19556]  INFO -- : worker=0 ready
I, [2016-08-29T09:19:14.818267 #30343]  INFO -- : unlinking existing socket=/tmp/unicorn.ourapp.sock
I, [2016-08-29T09:19:14.818639 #30343]  INFO -- : listening on addr=/tmp/unicorn.ourapp.sock fd=10
I, [2016-08-29T09:19:14.818807 #30343]  INFO -- : worker=0 spawning...
I, [2016-08-29T09:19:14.824358 #30343]  INFO -- : worker=1 spawning...
Run Code Online (Sandbox Code Playgroud)

一些相关信息:

  • 经过约8至20个小时的时间后,独角兽死亡。
  • 独角兽日志中没有记录任何错误。
  • 我搜索了所有/var/log被杀死进程的证据,只能找到几天前被杀死的一个不相关进程。
  • New Relic显示上一次随机关闭之前的内存使用情况平坦,红宝石使用了大约400mb。目前它的大小为480mb,没有问题,因此我认为它没有遇到内存限制。 …

ruby ruby-on-rails nginx unicorn

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

Rspec/capybara 请求无法查看页面内容

最终编辑: 感谢@PeterAlfvin 建议我专注于应用程序布局和标题,我能够修复它。我无法确切地弄清楚问题是什么,但标题中的某些内容导致水豚无法“看到”页面的其余部分。我删除了<%= render 'layouts/header' %>,重新构建了内部的标头application.html.erb,一旦它开始工作,将其拉出到部分并替换渲染语句。我摆弄了旧的和新的头文件来尝试找出问题,但还没有成功。这使得我的测试看起来有点脆弱,但如果问题再次出现,至少我会知道去哪里寻找。

编辑:如果您倾向于投反对票,请继续,但让我知道我忽略或未能研究的内容,因为您的评论可能会帮助我弄清楚这一点。

我已经搜索了几个小时试图解决这个问题,但我不知道发生了什么。我确信我错过了一些简单的东西,对于那些最后一天没有盯着它看的人来说,这些东西是显而易见的。无论如何,这就是我的希望。

我的所有 Rspec/capybara 请求规范都失败了,但是当我在浏览器中查看页面时,规范无法找到的所有元素都明显存在。据我所知,水豚没有看到整个页面 - save_and_open_page 返回一个几乎空白的页面。我在下面的规范中看到的失败是普遍的 - 规范可以看到页面标题,但看不到页面正文中的任何内容。我相当有信心我的所有路线都很好,因为所有标题测试都在应该通过的时候通过。

规格/请求/static_pages_spec.rb

require 'spec_helper'

describe "StaticPages" do

  subject { page }    

  describe "About page" do 
    before { visit about_path } 
    it { save_and_open_page; 
         should have_selector('title', text: 'Company Name | About') }    
    it { should have_selector('h1', text: 'About stuff') }
    it { should have_content('About paragraph') }
  end

  #more specs...

end
Run Code Online (Sandbox Code Playgroud)

结果:

5) StaticPages About page 
   Failure/Error: it { should have_selector('h1', text: 'About …
Run Code Online (Sandbox Code Playgroud)

tdd rspec capybara ruby-on-rails-3

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