小编Ale*_*xis的帖子

有没有什么好的方法来干扰范围/谓词逻辑重复?

例如,请考虑以下代码(在模型中):

scope :popular, where("views >= 250 OR (views >= 10 AND avg_rating >= 4.75)")

def popular?
  views >= 250 or views >= 10 && avg_rating >= 4.75
end
Run Code Online (Sandbox Code Playgroud)

第一个条件是SQL,第二个条件是ruby,但仍然存在明显的重复.干嘛有什么好方法吗?这种情况的最佳做法是什么?

activerecord scope ruby-on-rails dry ruby-on-rails-3

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

定义?(超级)检查的奇怪行为

最近我遇到了一些奇怪的行为,defined?用于检查super关键字是否可以在当前上下文中使用.通常它工作正常,但当我尝试将defined? super检查与一点点元编程相结合时,它给了我意想不到的结果.

然后展示更容易描述,所以这里有一个举例说明问题:

class A; 
  def self.def_f!; 
    singleton_class.send(:define_method, :f) { defined? super }
  end
end
class AA < A; end
Run Code Online (Sandbox Code Playgroud)

(AAA类都有.def_f!类方法)

A.def_f!

A.f  # => nil
AA.f # => nil
Run Code Online (Sandbox Code Playgroud)

(A.f没有超级和AA.f派遣A.f,所以一切都好,到目前为止,但......)

AA.def_f! # define its own .f method in the AA class

AA.f # => "super"
A.f  # => "super" # WHY???
Run Code Online (Sandbox Code Playgroud)

谁能解释我最后一行?A.f没有超级方法,为什么它返回"super"而不是nil?这是一个错误吗?

(我在1.9.2和1.9.3中尝试过 - 相同的结果) …

ruby metaprogramming

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

在ruby中没有参数的DSL块

我正在用红宝石写一个简单的dsl.几周前,我偶然发现了一些博文,其中展示了如何转换代码:

some_method argument do |book|
  book.some_method_on_book
  book.some_other_method_on_book :with => argument
end
Run Code Online (Sandbox Code Playgroud)

更清洁的代码:

some_method argument do
   some_method_on_book
   some_other_method_on_book :with => argument
end
Run Code Online (Sandbox Code Playgroud)

我不记得如何做到这一点,我不确定缺点,但更清晰的语法是诱人的.有没有人对这种转变有所了解?

ruby dsl block

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

改变devise_invitable邮件主题

默认情况下,邀请邮件的主题是

  mailer:
      invitation_instructions:
        subject: 'Invitation instructions'
Run Code Online (Sandbox Code Playgroud)

我想改成它

subject: '%{invited_by} has invited you!'
Run Code Online (Sandbox Code Playgroud)

但是这需要让i8n的translate方法可以访问invite_by变量.

如何在不更改默认行为的情况下访问/声明此变量?

ruby-on-rails actionmailer devise rails-i18n devise-invitable

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