小编Jig*_*hel的帖子

Rails遗留应用程序和Ruby 2错误:无法加载文件类型yml的翻译未知

我有一个遗留的Rails应用程序,我想升级到最近的Rails和Ruby版本.首先,我试图用Ruby 2.1.2设置应用程序

$ rails -v
Rails 2.3.18

$ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [i686-linux]
Run Code Online (Sandbox Code Playgroud)

当我尝试运行rake任务时rake db:schema:load RAILS_ENV=test遇到错误

 can not load translations from /activesupport-2.3.18/lib/active_support/locale/en.yml, the file type yml is not known
Run Code Online (Sandbox Code Playgroud)

通过Google搜索我发现以下参考https://github.com/rails/rails/issues/10514,其中提到Rails 2.3和Ruby 2+版本之间存在不兼容性.

任何人都可以帮我申请参考链接中提到的猴子补丁吗?

谢谢,Jignesh

ruby-on-rails-2 ruby-2.1

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

Ruby试图动态创建Unicode字符串会引发“无效的Unicode转义”错误

我有一个需要使用插值动态创建unicode字符串的要求。例如,请参见以下在irb中试用的代码

2.1.2 :016 > hex = 0x0905
 => 2309 
2.1.2 :017 > b = "\u#{hex}"
SyntaxError: (irb):17: invalid Unicode escape
b = "\u#{hex}"
Run Code Online (Sandbox Code Playgroud)

十六进制代码0x0905对应于DEVANAGARI字母A的独立元音的unicode。

我无法弄清楚如何达到期望的结果。

ruby string unicode dynamic

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

Ruby str.match(regex) 返回仅包含第一个匹配项的 MatchData

使用红宝石 2.2

我有如下字符串:

  • 每周二和周五
  • 每周一、周三和周六
  • 每月每两周的星期一

为了从上面显示的字符串中提取星期几,我编写了以下正则表达式:

/\b(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\b/
Run Code Online (Sandbox Code Playgroud)

当尝试使用String#match实例方法时,match_data 不会返回所有匹配项。例如,请参考下面显示的 irb 输出,其中当字符串Weekly on Tuesday and Friday与上面显示的正则表达式匹配时,MatchData仅包含Tuesday. 我预计它也包含Friday

  2.2.1 :001 > str = "Weekly on Tuesday and Friday"
  => "Weekly on Tuesday and Friday" 
  2.2.1 :002 > regex = /\b(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\b/
  => /\b(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\b/ 
  2.2.1 :003 > str.match(regex)
  => #<MatchData "Tuesday" 1:"Tuesday"> 
  2.2.1 :004 > match_data = str.match(regex)
  => #<MatchData "Tuesday" 1:"Tuesday"> 
  2.2.1 :005 > match_data.captures
  => ["Tuesday"] 
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下,当我在正则表达式中没有使用任何开始/结束锚点时,为什么 MatchData 只包含第一个匹配的术语?我确信我的正则表达式遗漏了一些东西,但我无法弄清楚。

笔记

Rubular …

regex ruby-2.2

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

使用include和extend的Ruby模块mixin - 它是如何工作的?

以下是代码段:

模块:ActiveSupport ::关注

    module ActiveSupport
      module Concern
        def self.extended(base)
          base.instance_variable_set("@_dependencies", [])
        end

        def append_features(base)
          if base.instance_variable_defined?("@_dependencies")
            base.instance_variable_get("@_dependencies") << self
            return false
          else
            return false if base < self
            @_dependencies.each { |dep| base.send(:include, dep) }
            super
            base.extend const_get("ClassMethods") if const_defined?("ClassMethods")
            base.send :include, const_get("InstanceMethods") if const_defined?("InstanceMethods")
            base.class_eval(&@_included_block) if instance_variable_defined?("@_included_block")
          end
        end

        def included(base = nil, &block)
          if base.nil?
            @_included_block = block
          else
            super
          end
        end
      end
    end
Run Code Online (Sandbox Code Playgroud)

自定义模块:GeneralScopes

    module GeneralScopes
        extend ActiveSupport::Concern

        included do
          scope :reverse_order_by_date, :order => "date DESC"
          scope :recent, …
Run Code Online (Sandbox Code Playgroud)

ruby module include extend mixins

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

使用"自定义"队列名称的Sidekiq worker被分配到"default"队列

Rails 3.2.9
Ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux]
sidekiq  2.10.1
Run Code Online (Sandbox Code Playgroud)

如果我使用自定义队列名称定义下面的工作者

  class BulkEmailWorker
    include Sidekiq::Worker
    # https://github.com/mperham/sidekiq/wiki/Advanced-Options
    sidekiq_options(queue: :bulk_mails, backtrace: true)

    # https://github.com/mperham/sidekiq/wiki/Best-Practices
    # Section: Make your jobs small and simple
    def perform
      # https://github.com/mperham/sidekiq/wiki/Delayed-Extensions
      scheduled_mails = MailTemplate.with_schedule
      scheduled_mails.each do |mail_template|
        BulkMailer.delay.general_mail(mail_template.id)
      end
    end
  end
Run Code Online (Sandbox Code Playgroud)

我像这样调用这个工人:

  BulkEmailWorker.perform_async
Run Code Online (Sandbox Code Playgroud)

它不起作用(换句话说,不发送电子邮件).

检查redis中的数据我发现如下:

  redis 127.0.0.1:6379> keys *
  1) "myapp:stat:processed:2013-04-24"
  2) "myapp:queue:default"
  3) "myapp:stat:processed"
  4) "myapp:queues"

  redis 127.0.0.1:6379> lrange myapp:queue:default -100 100

   1) "{\"retry\":true,\"queue\":\"default\",\"timeout\":30,\"class\":\"Sidekiq::Extensions::DelayedMailer\",\"args\":[\"---\\n- !ruby/class 'BulkMailer'\\n- :general_mail\\n- - 1\\n\"],\"jid\":\"e46693944febf7ae26ec67a0\"}"
Run Code Online (Sandbox Code Playgroud)

redis 127.0.0.1:6379>

从上面可以看出,工作人员被分配到队列"默认",我想由于这个原因,工人无法处理.

我在上面的场景中使用以下命令启动了sidekiq:

  bundle exec …
Run Code Online (Sandbox Code Playgroud)

queue ruby-on-rails-3.2 sidekiq

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

Ruby Array#sort 如何知道块应该按升序或降序排序

相关问题已在/sf/answers/799950791/上提供,但我想了解的是

使用时

a.sort { |x, y| x <=> y } 
Run Code Online (Sandbox Code Playgroud)

它如何知道该块应按升序排序,并且在使用时类似

a.sort { |x, y| y <=> x } 
Run Code Online (Sandbox Code Playgroud)

它如何知道这个块应该按降序排序?我很困惑,因为这两个块都使用宇宙飞船运算符,并且预计在每次比较期间返回以下内容,以防出现以下情况a.sort { |x, y| x <=> y }

  • -1 如果 x < y
  • 0 如果 x == y
  • 1 如果 x > y

并在每次比较期间进行以下情况a.sort { |x, y| y <=> x }

  • -1 如果 y < x
  • 0 如果 y == x
  • 1 如果 y > x

现在我们来看一个数组示例:

2.3.2 :023 > a = [ …
Run Code Online (Sandbox Code Playgroud)

ruby sorting

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

Google Sheets API v4 service_account - 禁止:调用者没有权限(Google::Apis::ClientError)

红宝石:2.3.1

导轨:5.0.0

我需要通过 Google Sheets API 访问和更新我的私人 Google Sheet。最终这将通过我的 Rails 应用程序中的重复后台作业来完成。因此,我在 Google Cloud Console 中设置了一个服务帐户。

但是要开始使用 Google Sheets API,我创建了一个脚本:

require 'google/apis/sheets_v4'

ENV["GOOGLE_ACCOUNT_TYPE"] = 'service_account'
ENV["GOOGLE_CLIENT_EMAIL"] = '<client_email_from_downloaded_json_here>'
ENV["GOOGLE_PRIVATE_KEY"] = "<private_key_from_downloaded_json_here>"

SCOPE = Google::Apis::SheetsV4::AUTH_SPREADSHEETS

authorization = Google::Auth.get_application_default(SCOPE)

# Initialize the API
service = Google::Apis::SheetsV4::SheetsService.new
service.authorization = authorization

spreadsheet_id = '<MY SPREADSHEET ID HERE>'

sheet_name = 'Sheet1'

range = "#{sheet_name}!A2:B"

response = service.get_spreadsheet_values(spreadsheet_id, range)

puts 'No data found.' if response.values.empty?

response.values.each do |row|
  # Print columns A and B, which correspond to …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails google-oauth google-api-ruby-client google-sheets-api

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