2013-03-04 11 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 

Quanto sopra è un piccolo pezzo di logica dal metodo show in controller. Come faccio a spostarlo al presenter in modo che possa contenere la risposta JSON machine_games e fornire metodi per accedere ai giochi e link alla pagina successiva/precedente (e anche se non esistono). {non è familiare con l'uso del pattern di presentatore}Utilizzo di Presenter in binari

risposta

14

Creiamo un relatore per l'analisi di una risposta JSON in @games, @next_page e @previous_page.

# 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 

Ora la vostra azione di controllo dovrebbe essere simile a questo:

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

E lo si può utilizzare nelle viste:

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

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

e per dire a Rails per caricare le applicazioni/presentatori/directory insieme a modelli /, controller /, viste /, ecc. aggiungere questo a config/application.rb:

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

Questo è stato davvero utile. Grazie: D – kauschan

Problemi correlati