rails中未定义的方法sort_by

时间:2015-05-19 09:01:21

标签: ruby-on-rails web

我在演示者和控制器中使用sort或sort_by时遇到问题。它说未定义的方法'sort_by'。

它属于任何特定类吗?我在网上查了一下,但我找不到具体的东西。

任何人都可以阐明这一点吗?

这是我的演示者代码 -

$options = $_POST['options'];

    if($soptions=='Spa')
    {
    $service = $_POST['div1'];
    }else if($soptions=='Masaj')
    {
    $service = $_POST['div2'];
    }
    echo $serivce;

或者

def sortDocument()
    @list.sort do |a, b|
      (b.published_date <=> a.published_date) ||
      a.display_name <=> b.display_name
      @list
end

编辑:

错误讯息:

def sortDocument()
  @list.sort_by!{ |m| m.published_date }
end

演示 -

undefined method `sort_by!' for #<DocumentsBureauServices::DocumentList:0x007ff8250f8a28>

或者

class DocumentPresenter

  def initialize(list)
    @list = list
    @list = sort_document()
  end
 def sortDocument()
    @list.sort do |a, b|
      (b.published_date <=> a.published_date) ||
      a.display_name <=> b.display_name
      @list
 end
end

2 个答案:

答案 0 :(得分:2)

使用通过给定块映射枚举值生成的一组键对枚举进行排序...使用 sort_by ...

%w{ apple pear fig }.sort_by {|word| word.length}
              #=> ["fig", "pear", "apple"]

答案 1 :(得分:0)

看起来DocumentsBureauServices::DocumentList没有包含可枚举模块,也无法访问sort_by方法。

如果DocumentList确实是围绕可枚举对象的装饰器,那么您可以使用委托者。 ActiveSupport有一个专门委派的方法:http://apidock.com/rails/Module/delegate

在您的情况下,您可以像这样使用它:

class DocumentsBureauServices::DocumentList

  delegate :sort_by!, to: :my_enumerable

  def initialize(enumerable)
    @my_enumerable = enumerable
  end

end

然后你可以打电话给sort_by!在你的列表对象上:

@list = DocumentsBureauServices::DocumentList.new(Document.all)
@list.sort_by! {|m| m.published_date}
#=> [#Document1, #Document2, etc]

如果您想了解有关创建自己的演示者的更多信息,我是否可以建议优秀的RailsCast http://railscasts.com/episodes/287-presenters-from-scratch

我个人使用Draper库作为演示者:https://github.com/drapergem/draper,这使得呈现ActiveRecord对象变得轻而易举。这里有一个关于它的RailsCast:http://railscasts.com/episodes/286-draper