小编min*_*ank的帖子

如何使用Rspec测试后台作业(Sidekiq)?

我的应用程序的很大一部分依赖于后台作业来处理用户的网站,所以我需要编写一些测试来覆盖这些.

第一个问题是如何测试Sidekiq工人类中的代码app/workers/some_worker.rb

class SomeWorker
  include Sidekiq::Worker

  def perform(model_id)
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

其次,我如何存储如下所示的代码,以便我不需要实际运行工作程序并减慢我的测试速度?

response = HTTParty.get("http://users-site.com", timeout: 30)
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails stub background-process sidekiq

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

如何使rails外部数据库调用?

所以我希望能够config/database.yml 从我的Then模型中添加一个外部数据库.

这可能吗?我一直无法弄清楚如何.

"连接到不同型号的多个数据库

通常通过创建ActiveRecord::Base.establish_connection和检索连接ActiveRecord::Base.connection.继承自的所有类ActiveRecord::Base都将使用此连接.但您也可以设置特定于类的连接.例如,如果CourseActiveRecord::Base,但是驻留在不同的数据库中,您可以说Course.establish_connection,Course并且它的所有子类都将使用此连接.

通过将连接池保持ActiveRecord::Base为由类索引的哈希来实现此功能.如果请求连接,则retrieve_connection方法将上升到类层次结构,直到在连接池中找到连接."

database ruby-on-rails

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

在Heroku上正确配置Unicorn和Sidekiq

我收到ActiveRecord::StatementInvalid (PG::Error: SSL error: decryption failed or bad record mac错误所以我按照本指南关于将Unicorn部署到Heroku并且似乎已经修复了它.然而,根据警告,它显示了如何配置Resque这样的设置 - 我是否必须做类似的事情Sidekiq

示例代码来自Heroku:

before_fork do |server, worker|

  ...

  # If you are using Redis but not Resque, change this
  if defined?(Resque)
    Resque.redis.quit
    Rails.logger.info('Disconnected from Redis')
  end
end

after_fork do |server, worker|

  ...

  # If you are using Redis but not Resque, change this
  if defined?(Resque)
    Resque.redis = ENV['REDIS_URI']
    Rails.logger.info('Connected to Redis')
  end
end
Run Code Online (Sandbox Code Playgroud)

这就是我目前设置的内容:

配置/ unicorn.rb

worker_processes 2
timeout 30 …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails heroku unicorn ruby-on-rails-3.2 sidekiq

10
推荐指数
2
解决办法
6377
查看次数

Rails和Postgresql:如何按小时对查询进行分组?

如何在Postgres&Rails中按小时分组?我已经阅读了很多SO答案,但我收到了错误.

这在按日期分组时有效:

Model.group("date(updated_at)").count
Run Code Online (Sandbox Code Playgroud)

然后我尝试了以下一小时,但他们没有工作:

Model.group("hour(updated_at)").count
Model.group("date_format(updated_at, '%H')").count
Model.group("extract(hour from updated_at)").count
Run Code Online (Sandbox Code Playgroud)

一旦我找到了需要更新的特定时间,我将如何获得那些时间的模型?即:

Model.where("hour(updated_at) = ?", 5)
Run Code Online (Sandbox Code Playgroud)

postgresql time group-by ruby-on-rails

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

Ruby on Rails将列表拆分或切片成列

@locations = Location.all #current listing all

@locations = Location.slice(5) or Location.split(5)
Run Code Online (Sandbox Code Playgroud)

使用Ruby我试图将列表拆分为4列,每列限制为5列; 但是切片或分裂似乎都不起作用.知道我可能做错了什么吗?任何帮助是极大的赞赏.

ruby ruby-on-rails

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

如何在Rails 4中禁用所有CLI测试日志?

我已经成功地禁用ActiveRecord有关日志通过设置config.active_record.logger = nilconfig/environments/test.rb

我仍然得到以下输出:

Processing by Admin::WebsitesController#edit as HTML
  Parameters: {"id"=>"226"}
  Rendered admin/websites/_form.html.erb (6.8ms)
  Rendered admin/websites/edit.html.erb within layouts/application (7.2ms)
Completed 200 OK in 36ms (Views: 33.5ms | ActiveRecord: 0.0ms)
Run Code Online (Sandbox Code Playgroud)

我尝试了以下选项,但他们没有帮助:

ActiveRecord::Base.logger = nil
config.action_controller.logger = nil
config.action_view.logger = nil
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

logging rspec ruby-on-rails command-line-interface ruby-on-rails-4

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

测试电子邮件:通过后台工作人员发送的最后一封电子邮件为零

我正在尝试使用这个railscast为电子邮件添加一些测试,但是我得到了undefined method 'to' for nil:NilClass.

这些电子邮件是通过使用一个后台工作实际处理Sidekiq,我知道他们正确地发送,因为他们在生产工作,也是我之前加入,他们将发送require 'sidekiq/testing'spec_helper.rb

所以基本上我的问题是我如何访问Sidekiq的电子邮件?我试图让工作人员处理电子邮件,但仍然遇到同样的错误.

规格/支持/ mailer_macros.rb

module MailerMacros
  def last_email
    ActionMailer::Base.deliveries.last
  end

  def reset_email
    ActionMailer::Base.deliveries = []
  end
end
Run Code Online (Sandbox Code Playgroud)

投机/ spec_helper.rb

require 'sidekiq/testing'
...
config.include MailerMacros
config.before(:each) { reset_email }
Run Code Online (Sandbox Code Playgroud)

配置/环境/ test.rb

config.action_mailer.delivery_method = :test
config.action_mailer.default_url_options = { host: 'localhost:8080' }
Run Code Online (Sandbox Code Playgroud)

控制器/ tickets_controller.rb

def create
  @ticket = current_user.tickets.build(params[:ticket])   
  if @ticket.save
    Sidekiq::Client.enqueue(TicketNotifier, @ticket.id)
    flash[:success] = "Your ticket has been submitted successfully."
    redirect_to ticket_path(@ticket)
  else
    render 'new'
  end
end …
Run Code Online (Sandbox Code Playgroud)

email testing rspec ruby-on-rails sidekiq

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

如何填充设计用户

我想使用faker和populator gems用虚假数据填充数据库.使用Devise生成模型用户.

这是我的rake文件

namespace :db do
  desc "Fill database with sample data"
  task populate: :environment do
    [User, Article].each(&:delete_all)
    password = "password"

    User.populate 20 do |user|
      user.name = Faker::Name.name
      user.email = Faker::Internet.email
      user.password = password
      user.password_confirmation = password
      Article.populate 5 do |article|
        article.user_id = user.id
        article.title = Populator.words(1..3).titleize
        article.content = Populator.sentences(2..10)
        article.created_at = 2.years.ago..Time.now
      end
    end

  end
end
Run Code Online (Sandbox Code Playgroud)

当我运行rake db:populate引发以下内容

rake aborted!
undefined method `password=' for #<Populator::Record:0xa179d14>
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/populator-1.0.0/lib/populator/record.rb:64:in `method_missing'
    /home/sunloverz/RubymineProjects/socialnews/lib/tasks/sample_date.rake:10:in `block (3 levels) in <top (required)>'
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/populator-1.0.0/lib/populator/factory.rb:53:in `call'
    /home/sunloverz/.rvm/gems/ruby-1.9.3-p385/gems/populator-1.0.0/lib/populator/factory.rb:53:in `block in …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails devise

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

Heroku,Nokogiri和Sidekiq内存泄漏 - 如何调试?

我刚刚切换到在Heroku上使用Sidekiq,但是在我的工作运行一段时间之后我得到了以下内容:

2012-12-11T09:53:07+00:00 heroku[worker.1]: Process running mem=1037M(202.6%)
2012-12-11T09:53:07+00:00 heroku[worker.1]: Error R14 (Memory quota exceeded)
2012-12-11T09:53:28+00:00 heroku[worker.1]: Error R14 (Memory quota exceeded)
2012-12-11T09:53:28+00:00 heroku[worker.1]: Process running mem=1044M(203.9%)
Run Code Online (Sandbox Code Playgroud)

它一直在增长.

对于这些工作,我正在使用Nokogiri和HTTParty来检索URL并解析它们.我已经尝试过改变一些代码但我真的不确定我在寻找什么.我该如何调试呢?

我尝试将New Relic添加到我的应用程序,但不幸的是,它还不支持Sidekiq.

此外,在谷歌搜索后,我正在尝试切换到SAX解析器,看看是否有效,但我卡住了.这是我到目前为止所做的:

class LinkParser < Nokogiri::XML::SAX::Document
  def start_element(name, attrs = [])
    if name == 'a'
      puts Hash[attrs]['href']
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后我尝试类似的东西:

page = HTTParty.get("http://site.com")
parser = Nokogiri::XML::SAX::Parser.new(LinkParser.new)
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用以下方法和我使用HTTParty检索的数据,但是无法使这些方法中的任何一个正常工作:

 parser.parse(File.read(ARGV[0], 'rb'))
 parser.parse_file(filename, encoding = 'UTF-8')
 parser.parse_memory(data, encoding = 'UTF-8') 
Run Code Online (Sandbox Code Playgroud)

更新

我发现解析器没有工作,因为我正在调用parser.parse(page)而不是parser.parse(page.body) 我尝试使用上面的脚本打印出各种网站的所有html标签,而对于某些网站,它打印出所有标签,而对于其他网站,它只打印出几个标签.

如果我使用Nokogiri::HTML()而不是parser.parse()它工作正常.

我正在使用Nokogiri::XML::SAX::Parser.new()而不是 …

ruby heroku nokogiri httparty sidekiq

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

Rails为所有命令行方法(如generate或rake)提供NameError

我是Rails的初学者,我一直试图找出过去几天世界上出了什么问题,但绝对没有运气.我到处搜索,但一无所获.基本上,当我运行任何类型的命令行方法时,我将得到一个NameError.我试过在不同的项目目录中运行它以及以前的工作.铁轨似乎刚刚破裂......

我正在运行Win7-32​​bit,使用NetBeans 6.9.1编辑文件,使用cmd.exe运行rails console.

一切都运作良好大约两个星期,然后这突然发生了.这里有一些例子:

rails生成模型:

irb(main):004:0> rails generate model datatest  
NameError: undefined local variable or method `datatest' for main:Object  
from (irb):4  
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands/console.rb:44:in `start'  
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands/console.rb:8:in `start'  
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands.rb:23:in `<top (required)>'  
from script/rails:6:in `require'  
from script/rails:6:in `<main>' 
Run Code Online (Sandbox Code Playgroud)

rails生成迁移:

irb(main):003:0> rails generate migration rename_password_to_hashed_password  
NameError: undefined local variable or method `rename_password_to_hashed_password' for main:Object  
from (irb):3  
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands/console.rb:44:in `start'  
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands/console.rb:8:in `start'  
from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.0.3/lib/rails/commands.rb:23:in `<top (required)>'  
from script/rails:6:in `require'  
from script/rails:6:in `<main>' 
Run Code Online (Sandbox Code Playgroud)

rake db:migrate:

irb(main):005:0> rake db:migrate  
NameError: undefined local variable …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails nameerror ruby-on-rails-3

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

我应该使用get,post,put - 这有关系吗?

在我的应用程序中,我在点击时间链接时切换是否student属于training time或不属于.

# controller
def time
  @student = Student.find(params[:student_id])
  @time = TrainingTime.find(params[:training_time_id])
  @student.toggle_time(@time)
  respond_to do |format|
    format.html { redirect_to @student }
    format.js
  end
end

# routes
resources :students do
  match "time/:training_time_id", to: "students#time", as: :toggle_time
end

# view
<%= link_to t.time_format, student_toggle_time_path(@student, t), remote: true %>
Run Code Online (Sandbox Code Playgroud)

目前它正在使用匹配,但是设置它的正确方法是什么?为什么?

感谢您的输入.

routing routes ruby-on-rails http-verbs ruby-on-rails-3.2

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

如何评估随机数学运算符?

我是Ruby和编程的新手.我一直在尝试整理一个随机创建数学问题的小脚本并将其解决,但是我在生成随机数学运算符时遇到了麻烦.

我的脚本到目前为止:

num = (1..10).to_a

num1 = num.shuffle[0]
num2 = num.shuffle[0]

op = %w{+ - = /} 
op1 = op.sample

puts w = "#{num1} #{op1} #{num2}"

puts "Your answer is:"
answer = gets()

solution = num1 + "what do I put here??" + num2

if answer.to_i == solution
  puts "Correct! The answer is #{solution}"
else
  puts "Incorrect, the answer is #{solution}"
end
Run Code Online (Sandbox Code Playgroud)

我设法挑选出一个随机运算符,但不能在解决方案中使用它,因为它是一个字符串.

ruby expression operators

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