我有一個工作良好的下一個按鈕,但以前的按鈕只是不想玩好。有趣的是,我已經試圖建立這幾種不同的方式引用的SO和其他方法,但以前總是去的最早記載...上一個按鈕返回到第一個由於某些原因在Rails 3使用嵌套的路線
依我之見模型:
def previous
self.class.first(:conditions => ["created_at < ?", created_at], :order => "created_at asc")
end
def next
self.class.first(:conditions => ["created_at > ?", created_at], :order => "created_at asc")
end
而且在我看來:
<% if @submission.previous %>
<%= link_to "previous", contest_submission_path(@contest, @submission.previous),
:class => 'pull-left btn btn-large' %>
<% end %>
<% if @submission.next %>
<%= link_to "next", contest_submission_path(@contest, @submission.next),
:class => 'pull-right btn btn-large' %>
<% end %>
就像我說的,接下來工作很好,但以前返回到最早的記錄。我接近這個結局的智慧。任何人都有答案?
EDITED
日誌:
Started GET "/contests/1/submissions/1" for 127.0.0.1 at 2012-11-30 08:08:52 -0800
Processing by SubmissionsController#show as HTML
Parameters: {"contest_id"=>"1", "id"=>"1"}
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 2 ORDER BY users.created_at DESC LIMIT 1
Contest Load (0.3ms) SELECT "contests".* FROM "contests" WHERE "contests"."id" = $1 LIMIT 1 [["id", "1"]]
Submission Load (0.2ms) SELECT "submissions".* FROM "submissions" WHERE "submissions"."id" = $1 ORDER BY submissions.created_at ASC LIMIT 1 [["id", "1"]]
CACHE (0.0ms) SELECT "submissions".* FROM "submissions" WHERE "submissions"."id" = $1 ORDER BY submissions.created_at ASC LIMIT 1 [["id", "1"]]
Comment Load (0.4ms) SELECT "comments".* FROM "comments" WHERE "comments"."commentable_id" = 1 AND "comments"."commentable_type" = 'Submission' ORDER BY comments.created_at DESC, created_at
Submission Load (0.3ms) SELECT "submissions".* FROM "submissions" WHERE (created_at < '2012-10-08 14:32:40.590930') ORDER BY submissions.created_at ASC, created_at asc LIMIT 1
Submission Load (0.2ms) SELECT "submissions".* FROM "submissions" WHERE (created_at > '2012-10-08 14:32:40.590930') ORDER BY submissions.created_at ASC, created_at asc LIMIT 1
CACHE (0.0ms) SELECT "submissions".* FROM "submissions" WHERE (created_at > '2012-10-08 14:32:40.590930') ORDER BY submissions.created_at ASC, created_at asc LIMIT 1
CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 2 ORDER BY users.created_at DESC LIMIT 1
Image Load (0.2ms) SELECT "images".* FROM "images" WHERE "images"."parent_id" = 2 AND "images"."parent_type" = 'User' LIMIT 1
Rendered submissions/_follow_unfollow.html.erb (0.1ms)
Image Load (0.4ms) SELECT "images".* FROM "images" WHERE "images"."parent_id" = 1 AND "images"."parent_type" = 'Submission' LIMIT 1
Rendered submissions/_hide_comments_form.html.erb (1.9ms)
Rendered comments/_form.html.erb (2.5ms)
Rendered comments/_comment.html.erb (3.5ms)
Rendered submissions/show.html.erb within layouts/application (21.7ms)
Rendered layouts/_stylesheets.html.erb (4.3ms)
CACHE (0.0ms) SELECT "images".* FROM "images" WHERE "images"."parent_id" = 2 AND "images"."parent_type" = 'User' LIMIT 1
Role Load (0.5ms) SELECT "roles".* FROM "roles" INNER JOIN "assignments" ON "roles"."id" = "assignments"."role_id" WHERE "assignments"."user_id" = 2
Rendered layouts/_header.html.erb (4.6ms)
Rendered layouts/_footer.html.erb (0.7ms)
完成200 OK在105ms(瀏覽次數:97.8ms | ActiveRecord的:3.0毫秒)
日誌#2
Started GET "/contests/1/submissions/%23%3CActiveRecord::Relation:0x007fc3b5e50af8%3E" for 127.0.0.1 at 2012-11-30 08:43:15 -0800
Processing by SubmissionsController#show as HTML
Parameters: {"contest_id"=>"1", "id"=>"#<ActiveRecord::Relation:0x007fc3b5e50af8>"}
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 2 ORDER BY users.created_at DESC LIMIT 1
Contest Load (0.3ms) SELECT "contests".* FROM "contests" WHERE "contests"."id" = $1 LIMIT 1 [["id", "1"]]
Submission Load (0.3ms) SELECT "submissions".* FROM "submissions" WHERE "submissions"."id" = $1 LIMIT 1 [["id", "#<ActiveRecord::Relation:0x007fc3b5e50af8>"]]
Completed 500 Internal Server Error in 4ms
ActiveRecord::RecordNotFound (Couldn't find Submission with id=# <ActiveRecord::Relation:0x007fc3b5e50af8>):
app/controllers/submissions_controller.rb:89:in `find_submission'
最終解決方案:
在submission.rb
default_scope order: 'submissions.created_at DESC'
def previous_sub
self.class.where("created_at > ?", created_at).reorder("created_at asc").first
end
def next_sub
self.class.where("created_at < ?", created_at).reorder("created_at desc").first
end
鑑於(顯示):
<% if @submission.previous_sub %>
<%= link_to "previous", contest_submission_path(@contest, @submission.previous_sub),
:class => 'pull-left btn btn-large' %>
<% end %>
<% if @submission.next_sub %>
<%= link_to "next", contest_submission_path(@contest, @submission.next_sub),
:class => 'pull-right btn btn-large' %>
<% end %>
我結束了交換的方法的名稱,從而使節目記錄順序將匹配指數,這是在作用域DESC順序或最近到最早的順序。
你爲什麼要使用不同的順序(ASC和DESC)? –
您對以前的查詢很適合我。你確定你有正確的實例變量嗎?你在控制檯試過嗎? –
@AlperKarapınar感謝您獨立驗證。在控制檯它做同樣的事情,以前的回報記錄一。根據您的反饋,我嘗試將方法的名稱更改爲next_sub和previous_sub,並在瀏覽器和控制檯中對結果進行了相同的測試。之前仍然返回到第一條記錄。如果有人有任何其他建議,lmk –