我很确定错误与TenantIdLoader模块的实际内容无关.相反,它与ActiveSupport依赖关系有关.
我似乎无法克服这个错误.从我读过的内容来看,这是因为要么ActiveRecord::Base正在重新Company::TenantIdLoader加载,要么正在重新加载,而且它在某种程度上没有进行通信.请帮忙!我真的希望能够升级到Rails 4.2.
我现在已经知道这是因为我正在引用Tenant哪些是自动重新加载的.我需要能够实际引用该课程,所以有人知道如何解决这个问题吗?
配置/ application.rb中
config.autoload_paths += %W( #{config.root}/lib/company )
Run Code Online (Sandbox Code Playgroud)
配置/初始化/ company.rb
ActionMailer::Base.send(:include, Company::TenantIdLoader)
Run Code Online (Sandbox Code Playgroud)
LIB /公司/ tenant_id_loader.rb
module Company
module TenantIdLoader
extend ActiveSupport::Concern
included do
cattr_accessor :tenant_dependency
self.tenant_dependency = {}
after_initialize do
self.tenant_id = Tenant.active.id if self.class.tenant_dependent? and self.new_record? and Tenant.active.present? and !Tenant.active.zero?
end
end
# class methods to be mixed in
module ClassMethods
# returns true if this model's table has a tenant_id
def tenant_dependent?
self.tenant_dependency[self.table_name] ||= …Run Code Online (Sandbox Code Playgroud) 这里非常奇怪的错误.我们正确地收到了诸如"/ users/8788234"之类的请求
在Rails中我们称之为:
redirect_to(:controller => 'login', :from_external_page => true, :on_login => request.env['REQUEST_URI']) and return
Run Code Online (Sandbox Code Playgroud)
我们在Rails日志中看到(正如我们所期望的):重定向到
https://sampleapp.com/login?from_external_page=true&on_login=%2Fusers%2F8788234
Run Code Online (Sandbox Code Playgroud)
但是,我们从IP中看到的下一个请求是查询字符串的值已加扰:
Started GET "/login?from_external_page=gehr&on_login=%2Shfref%2S8788234" for xx.xxx.xxx.xxx at yyyy-mm-dd
Run Code Online (Sandbox Code Playgroud)
这两者都使查询字符串值无意义并导致以下错误:
ArgumentError: invalid %-encoding
Run Code Online (Sandbox Code Playgroud)
(%2F更改为%2S,无效).查询字符串中每个键值对的每个值都会移动13个字符.每次我们看到这个,用户代理读取:"Mozilla/5.0(兼容; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",但我们也看到用户代理成功导航应用程序.有没有人见过这样的东西?http://www.whatismybrowser.com/告诉我这个用户代理是在Windows 7上运行的IE9,但我们无法重现该错误.
有人知道一种干净的方法来避免ActiveJob::SerializationError在尝试序列化Date或Time对象时发生这种情况吗?
我到目前为止的两个解决方案是:
dump在加载参数时调用Marshal/JSON/YAML 然后load返回到Job(这很糟糕,因为我需要修补邮件程序作业)Date和Time像这样:/lib/core_ext/time.rb
class Time
include GlobalID::Identification
def id
self.to_i
end
def self.find(id)
self.at(id.to_i)
end
end
Run Code Online (Sandbox Code Playgroud)
/lib/core_ext/date.rb
class Date
include GlobalID::Identification
def id
self.to_time.id
end
def self.find(id)
Time.find(id).to_date
end
end
Run Code Online (Sandbox Code Playgroud)
哪个也很糟糕.谁有更好的解决方案?
知道如何Delayed::Job从ActiveJob入队获取id吗?当我排队一个工作时,我得到一个ActiveJob::Base带有a 的实例@job_id,但该工作ID似乎是ActiveJob的内部.到目前为止,我最好的猜测就是走下最近创建的工作:
active_job_id = GenerateReportJob.perform_later(self.id).job_id
delayed_job = Delayed::Job.order(id: :desc).limit(5).detect do |job|
YAML.load(job.handler).job_data['job_id'] == active_job_id
end
Run Code Online (Sandbox Code Playgroud)
但这似乎是各种各样的hacky.有点惊讶的ActiveJob没有返回ID Delayed::Job,特别是因为这是在作业入队时显式返回的内容.
==编辑
看起来我不是唯一一个(https://github.com/rails/rails/issues/18821)
在我的gemfile中,我有类似的东西:
gem 'net-sftp', '2.1.1', :require => 'net/sftp'
gem 'backup', '3.0.27'
gem 'watu_table_builder', :require => 'table_builder'
gem 'browser', '0.1.6'
Run Code Online (Sandbox Code Playgroud)
在Gemfile中你需要一个要求吗?我也找到了类似的东西:require => false.救命?
在ruby中,我看到很多代码都在执行以下操作:
def test(s)
s =~ /Macintosh/
end
Run Code Online (Sandbox Code Playgroud)
测试字符串是否与正则表达式匹配.但是,这会返回fixnum或nil,具体取决于它是否找到匹配项.有没有办法做同样的操作,但让它返回一个布尔值,看它是否匹配?
我认为这两个可能的解决方案是!(s =~ /Macintosh/).nil?和!(s !~ /Macintosh/),但那些都显得非常可读的.是否有类似的东西:
def test(s)
s.matches?(/Macintosh/)
end
Run Code Online (Sandbox Code Playgroud) Google搜索使我想到一些问题,希望同时使用Mongoid和activerecord。我已经看到了很多关于木乃伊的问题和很多关于ActiveRecord的问题,但是都没有将它们进行比较。
我想问题是,与用于MySQL的activerecord一起运行带有针对mongoid db的rails的mongoid适配器有什么好处?
似乎应该有更好的方法来做到这一点:
def some_method(argument = 'foo')
bar = argument == 'foo' ? 'foo' : "#{argument.to_s}_foo"
# ... do things with bar ...
end
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我也玩过
bar = ("#{argument}_" if argument != 'foo').to_s + argument
Run Code Online (Sandbox Code Playgroud)
但如果有什么看起来更复杂