2016-10-14 2 views
0

Das Problem ist, dass die Methode previous_modal das vorherige Foto in der Datenbank zurückgibt, nicht @user vorheriges Foto.Wie bekomme ich das vorherige Foto des Benutzers?

Zum Beispiel, wenn @user hat Fotos mit IDs 10, 9, 8, 7, 6, 1 und ich öffnen das modale für Foto-ID 6 und ich klicke vorherige, setzt es die href auf 5, statt 1.

UsersController 

def show 
    @user = User.find(params[:id]) 
    @photos = @user.photos.approved.order('created_at desc').paginate(page: params[:page], per_page: 9) 
    respond_to do |format| 
     format.html 
     format.js 
    end 
end 

users/show.html.erb 

<% @photos.in_groups_of(3, false).each do |group| %> 
    <% group.each do |photo| %> 
    ... 
    <div class="modal" id=<%="#{photo.id}"%> tabindex="-1" role="dialog"> 
    ... 
    <a class="previouslink" data-dismiss="modal" data-toggle="modal" href=<%="#"+"#{photo.previous_modal.id}"%>> 
    ... 

class Photo 

def previous_modal 
    if self.class.approved.where("id < ?", id).last == nil 
    return self 
    else 
    return self.class.approved.where("id < ?", id).last 
    end 
end 

Antwort

0

Ich löste es durch Zugabe von:

.where("user_id" => self.user.id) into the code. 
1

Auf Ihrer previous_modal Methode, sondern durch id des Suchens, Sie von created_at suchen könnte ... so etwas wie:

def previous_modal 

    if self.class.approved.where("created_at < ?", self.created_at).last == nil 
    return self 
    else 
    return self.class.approved.where("created_at < ?", self.created_at).last 
    end 
end 

Und für einen saubereren Code, würde ich vorschlagen:

def previous_modal 
    last_photo = self.class.approved.where("created_at < ?", self.created_at).last 
    last_photo ? last_photo : self   
end 

Es würde genauso funktionieren wie oben. Ich hoffe es hilft!

EDIT:

Ich bin nicht sicher, wie würden Sie das bekommen [10, 9, 8, 7, 6, 1] Array, aber wenn Sie es haben, es ist einfach ... Sie musste einfach Finde das Foto mit der ID auf der nächsten/vorherigen Position. Könnte denken, so etwas wie:

def previous_modal 

    photo_ids = self.user.photos.map(&id) #Get all photos ids for that user 
    self_index = photos_ids.index(self.id) #Get the index of this particular object id 
    previous_photo = Photo.find_by_id(photos_ids[self_index-1]) #Find the previous one 
    return (previous_photo || self) 
end 

Aber ich denke, in diesem Fall die photo_ids bestellt würde zurückgegeben, so wie oben das gleiche Ergebnis. Sie müssen einen Weg finden, dieses Array mit der Geschichte der Fotos zu verwalten ... viel Glück!

+0

Das bin ich die gleichen Ergebnisse wie mein Code gibt. Es gibt mir das vorherige Foto in der Datenbank, nicht das vorherige Foto von '@ user'. –

+0

werfen Sie einen Blick auf die Notiz bearbeiten, bitte! –

+0

Entschuldigung für die Verwirrung. Es gibt kein Array. Ich habe nur gesagt, dass der Benutzer Fotos hochgeladen hat und diese Fotos diese IDs haben. Ich glaube, ich habe es gelöst. Danke für die Hilfe, ich habe noch ein paar Dinge aus deiner Antwort gelernt. Entschuldigung für schlechte Formulierung in Frage. –

Verwandte Themen