小编mxg*_*grn的帖子

可安装的发动机安装在哪条路径上

我需要知道,从可安装引擎的布局内部,它当前正在安装的路径.怎么办呢?

例如我的routes.rb包含以下行:

  mount BackendCore::Engine => "/backend"
Run Code Online (Sandbox Code Playgroud)

从BackendCore内部,我需要访问"/ backend"的值.

routes ruby-on-rails rails-engines ruby-on-rails-3.1

9
推荐指数
2
解决办法
2800
查看次数

重用named_scope来定义另一个named_scope

我看到问题的本质

有一天,如果我没弄错的话,我已经看到了重用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嵌套(我不是指链接)实际上可能吗?

activerecord named-scope ruby-on-rails searchlogic

8
推荐指数
2
解决办法
4892
查看次数

用作哈希键的符号在序列化时会转换为字符串

当我将一个数组或哈希分配给一个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.

ruby ruby-on-rails mongodb mongoid

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

检测到方法未被覆盖

说,我有以下两个类:

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)

ruby metaprogramming

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

开源项目站点的 org 或 com 域?

假设我有一个名为 Some Project 的开放项目。您是否建议在 someproject.com 或 someproject.org 下托管项目站点,为什么?我意识到 .org 更适合开源项目,但我担心从长远来看,我可能想(咳……)开始从中赚钱,而 .org 会在转向 .org 时产生误导。 com 可能会导致 SEO 和推广意义上的麻烦。我希望有人能对这个困境有所了解。

dns seo open-source domain-name

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

Rails 3中的插件与引擎,作为宝石出货

在Rails :: Plugin(对于Rails 3)的文档中,我正在阅读以下内容:

" ......你居然不能宣布一个Rails :: Engine上的插件内,否则会引起相同的文件被加载两次.这意味着,如果你想出货的发动机,宝石不能用作插件和副反之亦然".

任何人都可以更确切地了解哪些文件被加载两次?我宣布一个插件/宝石作为引擎,并能正常工作也正在把供应商/插件里面(我想保持这种方式),尽管在上面的语句.我只是想清楚一下为什么(以及是否)这不是一件好事.

谢谢!

plugins rubygems ruby-on-rails rails-engines

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

奇怪的行为:哈希的键取消动态方法定义

假设我想要一些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 hash metaprogramming

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