代码之家  ›  专栏  ›  技术社区  ›  Gav

Rails:命名的_scope、lambda和blocks

  •  51
  • Gav  · 技术社区  · 15 年前

    我认为以下两个是等效的:

    named_scope :admin, lambda { |company_id| {:conditions => ['company_id = ?', company_id]} }
    
    named_scope :admin, lambda do |company_id| 
      {:conditions => ['company_id = ?', company_id]}
    end
    

    但鲁比抱怨:

    ArgumentError: tried to create Proc object without a block
    

    有什么想法吗?

    4 回复  |  直到 9 年前
        1
  •  76
  •   Martin DeMello    15 年前

    这是一个解析器问题。试试这个

    named_scope :admin, (lambda do |company_id| 
      {:conditions => ['company_id = ?', company_id]}
    end)
    
        2
  •  17
  •   Community Sam Holder    7 年前

    我认为这个问题可能与 {...} do...end

    有一些这样的讨论 here

    我认为将lambda赋给变量(这将是一个proc) 能够 用A完成 do ... end :

    my_proc = lambda do 
      puts "did it"
    end
    my_proc.call #=> did it
    
        3
  •  9
  •   Kelvin    9 年前

    如果您使用Ruby1.9或更高版本 ,您可以使用lambda文本(箭头语法),它具有足够高的优先级,以防止方法调用“窃取”lambda中的块。

    named_scope :admin, ->(company_id) do 
      {:conditions => ['company_id = ?', company_id]}
    end
    

    1第一个稳定的Ruby1.9.1版本是2009-01-30。

        4
  •  7
  •   khelll    15 年前

    我可以说,这与优先权有关。

    1.upto 3 do # No parentheses, block delimited with do/end
      |x| puts x 
    end
    
    1.upto 3 {|x| puts x } # Syntax Error: trying to pass a block to 3!