这是一个难以解释的问题.我在另一个模块名称空间中有一个模块,如下所示
# app/models/points/calculator.rb
module Points
module Calculator
def self.included(base)
base.send(:include, CommonMethods)
base.send(:include, "Points::Calculator::#{base}Methods".constantize)
end
end
end
Run Code Online (Sandbox Code Playgroud)
那么在其他课程中,我需要做的就是:
class User
include Points::Calculator
end
Run Code Online (Sandbox Code Playgroud)
我已经在application.rb中指定了这个目录可以自动加载...(尽管我认为rails通过模型进行递归...)
config.autoload_paths += Dir[ Rails.root.join('app', 'models', "points") ]
Run Code Online (Sandbox Code Playgroud)
在开发环境中,一切正常.运行测试(和生产环境)时,我收到以下错误:
Unable to autoload constant Points::Calculator, expected /Users/pete/work/recognize/app/models/points/calculator.rb to define it (LoadError)
Run Code Online (Sandbox Code Playgroud)
我实际上遵循了这里的建议来解决问题:通过在application.rb中明确要求calculator.rb,阻止Rails在开发模式下卸载模块.
但是,为什么会发生这种情况?
我在ActiveSupport的dependencies.rb文件中粘贴了一些调试输出,并注意到这个文件需要两次.第一次需要我可以看到常量确实已加载.
但是第二次它需要的常量已被卸载,就Rails而言,但是当调用实际的require时,ruby返回false,因为ruby知道它已经需要它.然后Rails抛出"无法自动加载常量"错误,因为常量仍然不存在,并且ruby没有"重新要求"该文件.
任何人都可以阐明为什么会发生这种情况?
题
OneLogin 的 Ruby gem 可以配置为在我们的应用程序 saml 元数据 xml 中返回多种名称 ID 格式吗?
语境:
我们是一家使用 Onelogin 的 Ruby gem 进行 SAML SSO 的服务提供商,我们有一个客户正在将他们的 ADFS 2.0 与我们的应用程序集成。我们已经成功设置了这一点,并且有许多其他客户使用 ADFS,但是,由于与 nameID 格式配置有关,这个客户遇到了麻烦。
当用户访问我们服务器上的 ACS url 时,我们看到错误:"The status code of the Response was not Success, was Requester => InvalidNameIDPolicy"
。在客户的 ADFS 事件日志中,我们看到"Actual NameID properties: null."
我们已经三重检查了客户的中继方信任中的声明是否正确,将 AD 属性 EmailAddress 的声明映射到电子邮件地址的传出声明,然后将电子邮件地址的附加转换声明转换为 NameID 格式为电子邮件的传出声明。
此配置与之前没有出现问题的客户以及与其他服务提供商成功配置的客户的其他中继方信任一致。
我们查看了其他服务提供者元数据 xml,我们注意到它们返回多种名称 ID 格式。例如,他们有带 Zoom 的 SSO,Zoom 的元数据 xml 显示 nameid 格式:emailAddress、transient、persistent、unspecified 和 X509SubjectName。
我的问题是:可以将 OneLogin 的 Ruby gem 配置为在我们的应用程序 …
考虑这个设置:
#app/models/user.rb
class User > ActiveRecord::Base
attr_accessible :login, :options
serialize :options, OpenStruct
end
#app/views/users/_form.html.erb
form_for @user do |f|
f.label :login
f.fields_for :options, @user.options do |options|
options.label :emailme
end
end
#config/locals/en.yml
en:
activerecord:
attributes:
user:
login: "User Name"
options:
emailme: "Email Preference"
Run Code Online (Sandbox Code Playgroud)
我试图解决的问题是能够本地化序列化属性“选项”的属性(:emailme)的标签标记。
我深入研究了 rails 源代码并发现问题是因为当我调用 options.label 时它期望有一个对象,但没有对象,因为传递的对象名称是“user[options” ] 并且这不是有效的实例变量名称。
请参阅rails github上form_helper.rb 的第 1124 行,它检索对象。有一条评论甚至提到当 object_name 是 item[subobject] 时回退到 nil。
因此,当它创建实际标签Line 1110 form_helper.rb 时,它默认为 method_name.humanize
有没有什么体面的方法来完成序列化属性的本地化?
考虑一下:
class Post < ActiveRecord::Base
has_many :comments
def last_comment
comments.last
end
end
railsconsole> p = Post.last
Post Load (0.2ms) SELECT `posts`.* FROM `posts` WHERE ORDER BY `posts`.`id` DESC LIMIT 1
railsconsole> p.last_message
Post Load (0.4ms) SELECT `comments`.* FROM `comments` WHERE `messages`.`post_id` = 14
railsconsole> p.last_message
Post Load (0.4ms) SELECT `comments`.* FROM `comments` WHERE `messages`.`post_id` = 14
Run Code Online (Sandbox Code Playgroud)
您会认为此处仅应进行两个查询:初始查找,然后是关联的加载。对该关联的后续调用应被缓存。但是,事实并非如此。因为Rails试图变得聪明并且仅加载最后一条记录,所以该关联从未加载和缓存。而且由于Rails不会跟踪最后一个记录(或关联上的第一个或任何其他自定义查询),因此它每次都会返回答案。
但是,如果要缓存关联怎么办?我搜索了SO,但找不到直接的答案。