我的应用程序的很大一部分依赖于后台作业来处理用户的网站,所以我需要编写一些测试来覆盖这些.
第一个问题是如何测试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) 所以我希望能够config/database.yml 从我的Then模型中添加一个外部数据库.
这可能吗?我一直无法弄清楚如何.
"连接到不同型号的多个数据库
通常通过创建ActiveRecord::Base.establish_connection和检索连接ActiveRecord::Base.connection.继承自的所有类ActiveRecord::Base都将使用此连接.但您也可以设置特定于类的连接.例如,如果Course是ActiveRecord::Base,但是驻留在不同的数据库中,您可以说Course.establish_connection,Course并且它的所有子类都将使用此连接.
通过将连接池保持ActiveRecord::Base为由类索引的哈希来实现此功能.如果请求连接,则retrieve_connection方法将上升到类层次结构,直到在连接池中找到连接."
我收到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) 如何在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) @locations = Location.all #current listing all
@locations = Location.slice(5) or Location.split(5)
Run Code Online (Sandbox Code Playgroud)
使用Ruby我试图将列表拆分为4列,每列限制为5列; 但是切片或分裂似乎都不起作用.知道我可能做错了什么吗?任何帮助是极大的赞赏.
我已经成功地禁用ActiveRecord有关日志通过设置config.active_record.logger = nil在config/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
我正在尝试使用这个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) 我想使用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) 我刚刚切换到在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()而不是 …
我是Rails的初学者,我一直试图找出过去几天世界上出了什么问题,但绝对没有运气.我到处搜索,但一无所获.基本上,当我运行任何类型的命令行方法时,我将得到一个NameError.我试过在不同的项目目录中运行它以及以前的工作.铁轨似乎刚刚破裂......
我正在运行Win7-32bit,使用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) 在我的应用程序中,我在点击时间链接时切换是否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)
目前它正在使用匹配,但是设置它的正确方法是什么?为什么?
感谢您的输入.
我是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)
我设法挑选出一个随机运算符,但不能在解决方案中使用它,因为它是一个字符串.