【问题标题】:Why does this named_scope create a NoMethodError?为什么这个 named_scope 会创建一个 NoMethodError?
【发布时间】:2011-03-11 23:42:43
【问题描述】:

我没有看到这段代码在哪里创建了这个 NoMethodFound 错误,我真的很想得到任何有用的建议。

这是错误信息:

NoMethodError in UploadsController#create

我的模型的相关部分如下所示:

  named_scope :by_name, lambda { |marker_name| 
    {:conditions => ["marker_name = ?", marker_name]}}

  def self.parse_file(file)
    FasterCSV.foreach(file.path,:headers=>"first_row", :col_sep=>"\t") do |row|

    if $header_row == 1
       $markers = {}         # define global hash for marker id lookup
        $markers_arry = []    # define global array for marker names
        get_markers(row)
        $header_row = 0
        # done with header row; loop back to beginning for first row of actual data
        next
      end
...
 def self.get_markers(row)
    offset = 8    # this was determine by trial-&-error
    i = 0
    for col in row
      i += 1
      if i < offset
        next
      end      
      this_marker = Marker.by_name(row[col])
      $markers[row[col]] = this_marker.id   # associate the marker_name with its id
      $markers_arry[col] = row[col]
    end
  end

跟踪看起来像:

> undefined method `by_name' for
> #<Class:0xb6726e40>
> vendor/rails/activerecord/lib/active_record/base.rb:1667:in
> `method_missing'
> app/models/upload.rb:99:in
> `get_markers'
> /usr/lib/ruby/gems/1.8/gems/fastercsv-1.5.4/lib/faster_csv.rb:362:in
> `each'
> /usr/lib/ruby/gems/1.8/gems/fastercsv-1.5.4/lib/faster_csv.rb:362:in
> `each' app/models/upload.rb:91:in
> `get_markers'
> app/models/upload.rb:37:in
> `parse_file'
> /usr/lib/ruby/gems/1.8/gems/fastercsv-1.5.4/lib/faster_csv.rb:1545:in
> `each'
> /usr/lib/ruby/gems/1.8/gems/fastercsv-1.5.4/lib/faster_csv.rb:1048:in
> `foreach'
> /usr/lib/ruby/gems/1.8/gems/fastercsv-1.5.4/lib/faster_csv.rb:1222:in
> `open'
> /usr/lib/ruby/gems/1.8/gems/fastercsv-1.5.4/lib/faster_csv.rb:1047:in
> `foreach' app/models/upload.rb:25:in
> `parse_file'
> app/controllers/uploads_controller.rb:55:in
> `create'
> vendor/rails/actionpack/lib/action_controller/base.rb:1162:in
> `send'

【问题讨论】:

  • 在我的主题行中,我的意思是说“named_scope”。我还应该补充一点,我正在使用 Rail 2.1 和 Ruby 1.8。

标签: ruby-on-rails named-scope ruby-on-rails-2 ruby-1.8


【解决方案1】:

请注意,在 Rails 3 中,named_scope 已重命名为 scope

【讨论】:

  • 谢谢!这个答案在我的项目中帮助了我。
【解决方案2】:

您是否尝试过只使用“by_name”而不是“Marker.by_name”?

此外,Rails 会动态生成许多类似的方法。例如,

Marker.find_by_name("your_name_here")

...无论如何都应该工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2011-11-21
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多