2011-11-14 29 views
1

我試圖讓will_paginate和Sinatra一起工作,並且我對will_paginate和DataMapper有一個問題。所以我有一個代碼:Will_paginate和DataMapper只能在irb中工作

require 'data_mapper' 
require 'will_paginate' 
require 'will_paginate/data_mapper' 
class User 
    include DataMapper::Resource 

    property :id, Serial # primary serial key 
    property :username, String, length: 5..15, unique: true 
    property :fullname, String, length: 5..25 
    property :email, String, required: true, unique: true, format: :email_address 
    property :hashed_password, String 
    property :created_at, Time, required: true 
    property :auth_token, String 
    property :locale, String 

    has n, :items 
end 

class Item 
    include DataMapper::Resource 
    property :id, Serial 
    property :question, String, required: true 
    property :answer, String, required: true 
    property :ef, Float 
    property :interval, Float 
    property :created_at, Time 
    property :updated_at, Time 
    property :reviev_at, Time 

    belongs_to :user 
end 

DataMapper::setup(:default, "sqlite3://#{File.expand_path(File.dirname(__FILE__))}/database2.db") 
DataMapper.finalize 
DataMapper.auto_upgrade! 

u = User.first 
p = u.items.paginate(page: 1) 
puts p.total_entries 

並運行它會導致一個問題:

/home/changs/src/PwS/vendor/bundle/ruby/1.9.1/gems/dm-core-1.1.0/lib/dm-core/query.rb:942:in `assert_valid_order': +options[:order]+ should not be empty if +options[:fields] contains a non-operator (ArgumentError) 
    from /home/changs/src/PwS/vendor/bundle/ruby/1.9.1/gems/dm-core-1.1.0/lib/dm-core/query.rb:773:in `block in assert_valid_options' 
    from /home/changs/src/PwS/vendor/bundle/ruby/1.9.1/gems/dm-core-1.1.0/lib/dm-core/query.rb:766:in `each' 
    from /home/changs/src/PwS/vendor/bundle/ruby/1.9.1/gems/dm-core-1.1.0/lib/dm-core/query.rb:766:in `assert_valid_options' 
    from /home/changs/src/PwS/vendor/bundle/ruby/1.9.1/gems/dm-core-1.1.0/lib/dm-core/query.rb:363:in `update' 
    from /home/changs/src/PwS/vendor/bundle/ruby/1.9.1/gems/dm-core-1.1.0/lib/dm-core/query.rb:386:in `merge' 
    from /home/changs/src/PwS/vendor/bundle/ruby/1.9.1/gems/will_paginate-3.0.2/lib/will_paginate/data_mapper.rb:54:in `total_entries' 
    from test.rb:39:in `<main>' 

但如果我註釋掉最後三行它工作在IRB休耕:

ruby-1.9.2-p290 :001 > require './test' # file with deleted last 3 lines 
=> true 
ruby-1.9.2-p290 :002 > u = User.first 
=> #<User @id=1 @username="Testt" @fullname="tetestse" @email="[email protected]" @hashed_password=nil @created_at=2011-11-14 00:00:00 +0100 @auth_token=nil @locale=nil> 
ruby-1.9.2-p290 :003 > p = u.items.paginate(page: 1) 
=> [#<Item @id=1 @question="A" @answer="B" @ef=nil @interval=nil @created_at=2011-11-14 00:00:00 +0100 @updated_at=2011-11-14 00:00:00 +0100 @reviev_at=nil @user_id=1>, #<Item @id=2 @question="C" @answer="D" @ef=nil @interval=nil @created_at=2011-11-14 00:00:00 +0100 @updated_at=2011-11-14 00:00:00 +0100 @reviev_at=nil @user_id=1>] 
ruby-1.9.2-p290 :004 > puts p.total_entries 
2 
=> nil 

回答

1

這發生的原因是從腳本調用p.total_entries時未加載p。在irb打印後,設置p後的值會導致它被加載。您可以致電total_entries,這樣才解決它通過重裝:

u = User.first 
p = u.items.paginate(page: 1) 
p.reload 
puts p.total_entries 

對我來說,這似乎是應該報告在will_paginate的錯誤。

+0

你是對的。它現在可以工作,但是當我將它與will_paginate一起使用時,DataMapper還有其他一些問題,所以我決定不使用will_paginate。感謝幫助! – chg