2016-03-21 11 views
0

Ich habe eine Website mit Rails und MongoDB zum Senden, Lesen und Aktualisieren von Elementen implementiert.
Es gibt einige verschiedene Bereiche auf der Website, in denen Sie Elemente anzeigen und basierend auf Suchbegriffen oder anderen Abfragemethoden filtern können.

Zum Beispiel: Auf der Homepage gibt es eine Liste von Kategorien nach denen sortiert werden kann. 'Anwendungsfall', 'Status', 'Level'. Wenn ein Benutzer auf die Schaltfläche "Use Case" klickt, wird eine Liste mit spezifischeren Kategorien für Anwendungsfälle wie "E-Commerce" angezeigt, wenn sie darauf klicken, dass ein div mit den Elementen gefüllt wird, deren Use Case gleich E ist. Handel. Von diesem Punkt an können sie auf einen "Details" -Knopf klicken, der ihnen alle Eigenschaften für den Gegenstand zeigt.
In dieser "detaillierten" Ansicht habe ich eine nächste und zurück Schaltfläche. Im Moment scrollt es durch die Datenbank von Gegenständen, indem es die Gegenstands-ID-Nummer inkrementiert und dekrementiert.
Ich möchte die nächste und zurück-Taste in der Lage sein, durch die Liste scrollen, die sie in der bevölkerten div präsentiert wurden. Es ist zugänglich durch eine Instanzvariable mit der Bezeichnung @items, die im Element-Controller initialisiert wird, aber nicht in der Detailansicht angezeigt wird, selbst wenn sie als globale Variable gespeichert wird.
Die einzige Option, an die ich gedacht habe, besteht darin, die Liste zu übergeben von Elementen durch als URL-Parameter - aber das scheint eine chaotische Art, es zu tun.
Gibt es eine andere Möglichkeit, eine Instanzvariable zwischen verschiedenen Ansichten zu übergeben?

Beispielcode:

item_controller.rb:
Rails & Mongoid - Scrollen durch bestimmte Gruppe von Datensätzen

def list 
    @items = Item.asc(:id) 
end 


list.html.erb:

<tbody> 
    <% @items.each do |item| %> 
      <% $list = @items%> 
     <tr> 
     <td><%= item.name %></td> 
     <td><% item.Use_Cases.each do |u| %> 
      <ul> 
      <li><%= u %></li> 
     </ul> 
      <% end %> 
     </td> 

     <td><%= item.Level %></td> 
     <td><%= item.Status %></td> 
     <td><%= link_to item, class: 'btn btn-default' do %> 
      <span class="glyphicon glyphicon-eye-open"></span>&nbsp;Details 
      <% end %> 
    </td> 
     </tr> 
    <% end %> 
    </tbody> 


show.html.erb - Scroll-Tasten:

<div class="panel-footer"> 
    <%if @item.id != @first_id %> 
     <% #need to change to scroll to previous in $list %> 
     <%= link_to item_path(:id => (@item.id-1)), class: 'btn btn-default' do %> 
      <span class="glyphicon glyphicon-menu-left"></span>&nbsp;Back 
     <% end %> 
    <% end %> 
    <%if @item.id != @last_id %> 
     <% #need to change to scroll to next in $list %> 
     <%= link_to item_path(:id => (@item.id+1)), class: 'btn btn-default' do %> 
      Next&nbsp;<span class="glyphicon glyphicon-menu-right"></span> 
     <% end %> 
    <% end %> 
    </div> 

Antwort

0

den gleichen Anwendungsbereich Verwenden Sie eine Liste der Elemente und ein einzelnes Element mit seiner nächsten und vorherigen retreive.

# item_controller.rb  

def list 
    @items = items_scope 
end 

def show 
    @item = items_scope.find(params[:id]) 
    @next_item_id = items_scope.select(:id).where("id > ?", params[:id]).first 
    @previous_item_id = items_scope.select(:id).where("id < ?", params[:id]).last 
end 

private 

def items_scope 
    # this scope might depend on url parameters which, for example, present current chosen category 
    # `order("id ASC")` is a very important part. it makes this solution work 
    Item.order("id ASC").any_other_scopes_or_conditions_depending_on_chosen_category 
end 

Nach Ansicht:

<%= link_to item_path(:id => @next_item_id) ... 
<%= link_to item_path(:id => @previous_item_id) ... 
+0

Für diese Situtation wird diese Lösung nicht funktionieren - ich brauche die '@ Elemente' Liste von 'list.html.erb' Ansicht passieren zu können, die Ansicht "show.html.erb" – Gcap

Verwandte Themen