我需要知道,从可安装引擎的布局内部,它当前正在安装的路径.怎么办呢?
例如我的routes.rb包含以下行:
mount BackendCore::Engine => "/backend"
Run Code Online (Sandbox Code Playgroud)
从BackendCore内部,我需要访问"/ backend"的值.
我看到问题的本质
有一天,如果我没弄错的话,我已经看到了重用named_scope来定义另一个named_scope的例子.像这样的东西(不记得确切的语法,但这正是我的问题):
named_scope :billable, :conditions => ...
named_scope :billable_by_tom, :conditions => {
:billable => true,
:user => User.find_by_name('Tom')
}
Run Code Online (Sandbox Code Playgroud)
问题是:如果可能的话,确切的语法是什么?我找不到它,谷歌也没有帮助.
一些解释
为什么我真的想要它,是因为我使用Searchlogic来定义一个复杂的搜索,这可能会产生如下表达式:
Card.user_group_managers_salary_greater_than(100)
Run Code Online (Sandbox Code Playgroud)
但到处都是太长了.因为据我所知,Searchlogic只是动态定义了named_scopes,我想在Card类上设置一个named_scope,如下所示:
named_scope from_big_guys, { user_group_managers_salary_greater_than(100) }
Run Code Online (Sandbox Code Playgroud)
- 这是我在named_scope中使用那个漫长的Searchlogic方法的地方.但是,再次,语法是什么?无法弄清楚.
恢复
那么,named_scope嵌套(我不是指链接)实际上可能吗?
当我将一个数组或哈希分配给一个Mongo文档的属性时,它被正确序列化,除了它们被用作哈希键时的符号.简单的例子:
irb>MyMongoModel.create :some_attr => {:a => [:b,:c]}
=> #<MyMongoModel _id: 4d861c34c865a1f06a000001, some_attr: {:a=>[:b, :c]}>
irb>MyMongoModel.last
=> #<MyMongoModel _id: 4d861c34c865a1f06a000001, some_attr: {"a"=>[:b, :c]}>
Run Code Online (Sandbox Code Playgroud)
请注意,some_attr检索的是{"a"=>[:b, :c]},而不是
{:a=>[:b, :c]}
对于嵌套的哈希(例如,在阵列或其他哈希内部)也会发生这种情况.在这种情况下有没有办法保留符号?
解
我在存储之前使用YAML手动序列化some_attr- YAML.dump(或Object#to_yaml),在读取属性后使用YAML :: load.YAML更好地保留了序列化对象.ActiveRecord正在使用YAML来实现其serialize类方法ActiveRecord::Base.
说,我有以下两个类:
class A
def a_method
end
end
class B < A
end
Run Code Online (Sandbox Code Playgroud)
是否有可能从(的实例)类乙内检测方法a_method是仅在超类中所定义,因此不被覆盖在乙?
更新:解决方案
虽然我已经将Chuck的答案标记为"已接受",但后来Paolo Perrota让我意识到解决方案显然可以更简单,并且它可能也适用于早期版本的Ruby.
检测B中是否覆盖了"a_method":
B.instance_methods(false).include?("a_method")
Run Code Online (Sandbox Code Playgroud)
对于类方法,我们使用singleton_methods类似的方法:
B.singleton_methods(false).include?("a_class_method")
Run Code Online (Sandbox Code Playgroud) 假设我有一个名为 Some Project 的开放项目。您是否建议在 someproject.com 或 someproject.org 下托管项目站点,为什么?我意识到 .org 更适合开源项目,但我担心从长远来看,我可能想(咳……)开始从中赚钱,而 .org 会在转向 .org 时产生误导。 com 可能会导致 SEO 和推广意义上的麻烦。我希望有人能对这个困境有所了解。
在Rails :: Plugin(对于Rails 3)的文档中,我正在阅读以下内容:
" ......你居然不能宣布一个Rails :: Engine上的插件内,否则会引起相同的文件被加载两次.这意味着,如果你想出货的发动机,宝石不能用作插件和副反之亦然".
任何人都可以更确切地了解哪些文件被加载两次?我宣布一个插件/宝石作为引擎,并能正常工作也正在把供应商/插件里面(我想保持这种方式),尽管在上面的语句.我只是想清楚一下为什么(以及是否)这不是一件好事.
谢谢!
假设我想要一些String的实例与其他"普通"实例的行为不同 - 例如取消"upcase"方法的效果.我做以下事情:
class String
def foo
def self.upcase
self
end
self
end
end
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,我需要它的方式:
puts "bar".upcase #=> "BAR"
puts "bar".foo.upcase #=> "bar"
Run Code Online (Sandbox Code Playgroud)
但是,只要我使用String的欺骗实例作为Hash的键,行为开始对我来说很奇怪:
puts ({"bar".foo => "code"}).keys.first.upcase #=> "BAR", not "bar"!
Run Code Online (Sandbox Code Playgroud)
...就好像忽略了foo方法,并将String的原始实例用作键.
任何人都可以看到这里发生了什么?谢谢你!
ruby ×3
activerecord ×1
dns ×1
domain-name ×1
hash ×1
mongodb ×1
mongoid ×1
named-scope ×1
open-source ×1
plugins ×1
routes ×1
rubygems ×1
searchlogic ×1
seo ×1