2013-03-04 1 views
5
json = JSON.parse(response.body) 
    @games = json['machine-games'] 

    paging = json['paging'] 
    if paging 
     if paging['next'] 
     next_page_query = paging['next'].match(/\?.*/)[0] 
     @next_page = "/machine_games/search#{next_page_query}" 
    end 

    if paging['previous'] 
     previous_page_query = paging['previous'].match(/\?.*/)[0] 
     @previous_page = "/machine_games/search#{previous_page_query}" 
    end 
    end 

Die oben ist ein kleines Stück von Logik aus der Show-Methode in controller.How kann ich es auf die Vortragende zu bewegen, so dass sie durch die machine_games JSON-Antwort halten würden und bieten Methoden, um die Spiele zugreifen und Nächste/vorherige Seite Links (und ob sie existieren oder nicht). {nicht vertraut mit der Verwendung des Moderatormusters}Mit Presenters in Schienen

Antwort

14

Lassen Sie uns einen Moderator für das Parsen einer JSON-Antwort in @games, @next_page und erstellen.

# app/presenters/games_presenter.rb 

class GamesPresenter 

    attr_reader :games, :next_page, :previous_page 

    def initialize json 
    @games = json['machine-games'] 

    paging = json['paging'] 
    if paging && paging['next'] 
     next_page_query = paging['next'].match(/\?.*/)[0] 
     @next_page = "/machine_games/search#{next_page_query}" 
    end 

    if paging && paging['previous'] 
     previous_page_query = paging['previous'].match(/\?.*/)[0] 
     @previous_page = "/machine_games/search#{previous_page_query}" 
    end 
    end 

end 

nun Ihre Controller-Aktion sollte wie folgt aussehen:

def show 
    # ... 
    @presenter = GamesPresenter.new(json) 
end 

Und Sie können es in Ihren Ansichten verwenden:

<% @presenter.games.each do |game| %> 
    ... 
<% end %> 

<%= link_to "Previous", @presenter.previous_page %> 
<%= link_to "Next", @presenter.next_page %> 

Und um Rails zu sagen, die Apps zu laden/presents/Verzeichnis zusammen mit models /, controllern /, views/usw. fügen Sie dies config/application.rb hinzu:

config.after_initialize do |app| 
    app.config.paths.add 'app/presenters', :eager_load => true 
end 
+1

Das war wirklich hilfreich. Danke: D – kauschan