可以试试用 rbenv 来安装,安装老版本 ruby 时,它会自动安装 1.0.2u 版的 openssl。
一开始我本地测试安装时报错 ./openssl_missing.h:71:6: error: conflicting types for 'HMAC_CTX_copy'
, 根据 https://github.com/rbenv/rbenv/issues/661 解决方法是加环境变量 CFLAGS。加上后我本地安装成功了,我的安装命令如下
CFLAGS="-Wno-error=implicit-function-declaration" rbenv install 2.0.0-p648
搜了一下,是 2.7 版时改的
可能是 ruby 版本太老,或者 gem 版本太新,可以gem env
看看本地的 rubygems 版本
谷歌搜到的建议是降 gem 版本 gem update --system 1.8.24
https://github.com/rubygems/rubygems/issues/536
可以试试 constraints 选项,例如
resources :programs, only: [:index], constraints: lambda { |req| req.format == :html } do
end
ASCII 图用的 https://asciiflow.com/#/
谢谢楼上提醒,我的表述确实有歧义,已修改。
因为我本地用的 arch linux,rvm 安装 ruby 时总是从源码编译安装。可能用更大众的 ubuntu 时,rvm 能直接安装现成的二进制包
触发sql
和has_many 数据存在内存
里的关系,你需要先看懂 Association 类和 Reflection 类
https://github.com/rails/rails/blob/v5.2.3/activerecord/lib/active_record/associations/association.rb
https://github.com/rails/rails/blob/v5.2.3/activerecord/lib/active_record/reflection.rb
loaded?
https://github.com/rails/rails/blob/b9ca94caea2ca6a6cc09abaffaad67b447134079/activerecord/lib/active_record/associations/collection_proxy.rb#L54
可能是 rubygems 版本的问题,我看你日志里的路径是 ruby/gems/3.0.0
。
我本地用 rvm 安装 ruby 3.0 后,gem -v 返回 3.2.3, 能正常 gem install redis -v 4.2.5。
但如果我切换 rubygem 版本 rvm install rubygems 3.0.0 --force , 或者 gem update --system 3.0.0 也会报错提示wrong number of arguments (given 2, expected 1
试试删掉 C:/Ruby30-x64/lib/ruby/gems/3.0.0/cache/redis-4.2.5.gem
缓存内的 gem,重新安装。
另外,看你的文件路径好像是 windows。社区不推荐新手用 windows https://ruby-china.org/wiki/install_ruby_guide
我是用 searchkick 这个 gem 操作 ES 的。可以 异步 地把任务放 sidekiq 里执行来 reindex
试试加上 Ractor.yield
看还报错吗?
e = (1..100000).to_a
arr = [e,e,e,e]
arr.map { |sub_arr|
Ractor.new(sub_arr) do |sub_arr|
Ractor.yield sub_arr.map {
md5(rand.to_s)
}
end
}.map{|r| r.take}.reduce(:+)
vim,主要插件如下
Plug 'ervandew/supertab'
Plug 'tpope/vim-commentary'
Plug 'jremmen/vim-ripgrep'
Plug 'junegunn/fzf.vim'
Plug 'vim-syntastic/syntastic'
Plug 'Shougo/deoplete.nvim'
1.用 keyword parameter https://thoughtbot.com/blog/ruby-2-keyword-arguments 如下
def test(x: 2, y: 3)
x + y
end
test(y: 5)
2.分号跟是否在 lambda 表达式里无关,就是分割语句用的。这个 y 没用
3.test[0] 看成两步处理
// 变量a等于test函数默认调用的结果,即5
a = test
// 5的二进制是101,所以5[0] == 1, 5[1] == 0, 5[2] == 1
a[0] == 1
a[1] == 0
a[2] == 1
但是这个只是改变了生成的 url,并不会改变实际的 url,如果真的需要拿到资源还是需要访问把 app 去掉的 url。
换个思路,正式站的静态文件都是 rake assets:precompile 过的,直接用软链接改变实际的 url 就行
ln -s ../public app
我看 kaminari 分页里是 to_unsafe_h,然后 except! 掉一些参数名 https://github.com/kaminari/kaminari/blob/ab8b1118bd721edc520a7cd32e0a72dc6d0d3608/kaminari-core/lib/kaminari/helpers/tags.rb#L25
@params = template.params
# @params in Rails 5 no longer inherits from Hash
@params = @params.to_unsafe_h if @params.respond_to?(:to_unsafe_h)
@params = @params.with_indifferent_access
@params.except!(*PARAM_KEY_EXCEPT_LIST)
@params.merge! params
一般引擎内的 controller 的命令空间都带有引擎名吧,形如YourEngine::ControllerName
直接调用 controller_path
就行吧?
我没用过 python,但我执行你的 python 代码
import json, hashlib
params = {"key": '爱你'}
u = json.dumps(params).encode('utf-8')
# b'{"key": "\\u7231\\u4f60"}'
返回的结果里,是单引号 包着双引号。因此\u
被转义成了\\u
。于是顺着这个思路,我把部分中文 utf8都 gsub 成了\\uXXXX 的形式
require 'json'
require 'digest'
params = { "key": '爱你' }
u = JSON.dump(params).gsub(':', ': ').gsub(',', ', ').gsub(/[\u4e00-\u9fa5]/) do |s| "\\u#{s.unpack('U')[0].to_s(16)}" end
res = Digest::SHA256.hexdigest(u)
puts res
# 981727d14419aedca58b2e719b4a9ff94cf20ef91e02c9cd22e7ee6f5744f630
如果你确定是 content-type 的问题,可以用 response.headers 来设置 headers
403 的原因应该跟 app.host 和 spec/下的helper都无关,你自己仔细检查下代码
可以用 axlsx 这个 gem,我当年抄的下拉框代码 https://gist.github.com/bradland/4228336
如果是用 rubyXL 这个 gem,下拉框代码是 https://github.com/weshatheleopard/rubyXL/issues/340
一楼是以为你用的服务器是 puma,但你应该是用的支持 passenger 的 nginx。nginx 的默认日志位置在/var/log/nginx
如果你是指的 active_record 的连接池 connection_pool 的话,在源码 https://github.com/rails/rails/blob/v5.0.7/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb#L345 里。
@connections
存了当前进程从数据库获取到的总连接;
@available
存@connections
中空闲的,可分配给线程的连接;
@thread_cached_conns
是个 hash,存了@connections
中已分配给线程的连接。
# rails c例子
# 连接池最多可以有多少个连接
ActiveRecord::Base.connection_pool.instance_eval { @size }
# 连接池目前已经从数据库获得了多少个连接
ActiveRecord::Base.connection_pool.instance_eval { @connections.size }
# 当前线程占用一个连接
User.first
ActiveRecord::Base.connection_pool.instance_eval { @connections.size }
# 新起一个线程,又占用一个连接
Thread.new {User.first; sleep}
ActiveRecord::Base.connection_pool.instance_eval { @connections.size }
# 查看每个线程占用的连接
ActiveRecord::Base.connection_pool.instance_eval { @thread_cached_conns.keys }
# 释放当前线程的连接
ActiveRecord::Base.connection_pool.release_connection
ActiveRecord::Base.connection_pool.instance_eval { @connections.size }
ActiveRecord::Base.connection_pool.instance_eval { @available.instance_eval{@queue.size} }
如果你是指数据库当前本身有多少个连接的话,mysql 的话,我查到是如下的 sql
ActiveRecord::Base.connection.exec_query("show status where `variable_name` = 'Threads_connected';")