ArgumentError: The scope body needs to be callable

ArgumentError: The scope body needs to be callable

我在插件中定义了以下方法:

class ReArtifactProperties < ActiveRecord::Base
  unloadable

  #attr_accessible :artifact_type

  scope :without_projects, :conditions => ["artifact_type != ?", 'Project']
  scope :of_project, lambda { |project|
    project_id = (project.is_a? Project) ? project.id : project
    {:conditions => {:project_id => project_id}}
  }

您的代码有几个问题,其中一些违反了 Ruby 的语法规则,而另一些则违反了 Rails 的 return 值要求。

当前错误的原因是语法错误。 lambda 的块必须在与 lambda 方法相同的行中定义。

现在,如果您已修复此问题,您会注意到一旦您使用范围,您的代码就会抛出其他异常。原因是范围的 return 值应该是一个 ActiveRecord 关系,而不仅仅是一个简单的哈希。

因此,您的范围定义应与此类似:

scope :of_project, lambda { |project|
  project_id = (project.is_a? Project) ? project.id : project
  where(:project_id => project_id)
}

既然 Rails 足够聪明,可以弄清楚如何从对象中获取 ID 以进行查询,您甚至可以摆脱其中的 project_id 逻辑并缩小范围定义为

scope :of_project, lambda { |project|
  where(:project_id => project)
}

Your code has several issues, some of which are violations of syntax rules of Ruby, while others violate return value requirements of Rails.

是的,关于 lambda 块,你是对的

最初的代码是:

scope :of_project, lambda { |project|
    project_id = (project.is_a? Project) ? project.id : project
    {:conditions => {:project_id => project_id}}
  }

修正后,缩减为:

scope :of_project, lambda { |project|
  project_id = (project.is_a? Project) ? project.id : project
  where(:project_id => project_id)
}

Now given that Rails is smart enough to figure out how to get the ID from an object for a query,

了解我从

http://rubyonrails.org/

学到的MVC架构 如何理解RAILS w.r.t Redmine Tool 的核心功能?它使用的mysql 默认数据库有一个非常庞大的模型结构currently.Could 将其简化以了解Rails?

的核心功能