NoMethodError:未定义的方法' - @'

时间:2013-03-17 13:34:32

标签: ruby sinatra ruby-2.0

这是我的Sinatra代码

  def self.sort_by_date_or_price(items, sort_by, sort_direction)
    if sort_by == :price
      items.sort_by{|x| sort_direction == :asc ? x.item.current_price : -x.item.current_price}
    elsif sort_by == :date
      items.sort_by{|x| sort_direction == :asc ? x.created_date : -x.created_date}
    end
  end

当我将此方法称为#sort_by_date_or_price(items, :date, :desc)时,它会返回错误NoMethodError: undefined method '-@' for 2013-02-05 02:43:48 +0200:Time

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

class Person
end
#=> nil
ram = Person.new()
#=> #<Person:0x2103888>
-ram
NoMethodError: undefined method `-@' for #<Person:0x2103888>
        from (irb):4
        from C:/Ruby200/bin/irb:12:in `<main>'

现在看看我如何修复它:

class Person
  def -@
   p "-#{self}"
  end
end
#=> nil
ram = Person.new()
#=> #<Person:0x1f46628>
-ram
#=>"-#<Person:0x1f46628>"
=> "-#<Person:0x1f46628>"

答案 1 :(得分:1)

问题是unary -运算符未在created_date使用的类Time中定义。你应该把它转换成一个整数:

items.sort_by{|x| sort_direction == :asc ? x.created_date.to_i : -x.created_date.to_i}

那也可以写成

items.sort_by{|x| x.created_date.to_i * (sort_direction == :asc ? 1 : -1)}