2016-10-27 23 views
0

目前,如果某人點擊了link_to,他們將被帶到上一個或下一個挑戰。通過@用戶對象的下一個和上一個?

但是link_to如何工作,只有@user的挑戰包括在內?

視圖

<% if @challenge.previous %> 
    <%= link_to 'Prev', challenge_path(@challenge.previous), class: "footer-left", style: "color: white; font-style: normal;" %> 
<% else %> 
    <%= link_to 'Home', root_url, class: "footer-left" %> 
<% end %> 

<% if @challenge.next %> 
    <%= link_to 'Next', challenge_path(@challenge.next), class: "footer-right" %> 
<% else %> 
    <%= link_to 'Home', root_url, class: "footer-right" %> 
<% end %> 

模式

def next 
    Challenge.where("id > ?", id).first # I get nil error for... Challenge.find_by(user_id: @user.id).where("id > ?", id).first 
end 

def previous 
    Challenge.where("id < ?", id).last # I get nil error for... Challenge.find_by(user_id: @user.id).where("id > ?", id).last 
end 

我知道@user沒有在模型中工作,但我只是用它作爲一個例子試圖讓User他們所屬的挑戰。

+0

用戶和挑戰之間是否存在'has_many'關係? – mysmallidea

+0

它是否曾經工作過,或者只有當你遇到最後一個挑戰時 –

+0

'@ user.challenges.where('id>?',@ challenge.id).first'應該用下一個更高的ID返回挑戰,假設一個用戶面臨很多挑戰。 – Stefan

回答

1

要瀏覽的用戶chalenges我假設你的模式是這樣的:

class User < ApplicationRecord 
    has_many :challenges 
end 

class Challenge < ApplicationRecord 
    belongs_to :user 
end 

那麼你的方法應該是:

class Challenge < ApplicationRecord 
    belongs_to :user 

    #don't use just "next" because it's a ruby reserved keyword that you can use to skip to the next iteration of a loop 
    def next_user_challenge 
    user.challenges.where('id > ?', id).first 
    end 

    def previous_user_challenge 
    user.challenges.where('id > ?', id).last 
    end 
end 

而且還有一點,瀏覽下一個和上挑戰我認爲如果您比較挑戰的日期或其他屬性會更好。例如:

#next challenge 
user.challenges.where('challenge_date > ?', challenge_date).order('challenge_date ASC').first 

#previous challenge 
user.challenges.where('challenge_date < ?', challenge_date).order('challenge_date ASC').first 
+0

這太棒了!謝謝!我使用兩個不同的日期類別來應對挑戰:'deadline'和'date_started'。你知道我可以通過齧合在一起的方式嗎? –

相關問題