I messaggi vengono recuperati dal database tramite il metodo latest
della classe Message
, che non è stato ancora creato e che scriveremo adesso. La ragione per cui è giusto aggiungere un metodo alla classe Message
piuttosto che scrivere il codice nel controller, o nella vista o in un helper, è che l'operazione di ricerca degli ultimi messaggi è strettamente collegata al modello.
Concettualmente è il modello che sa come andare a pescare i dati e non la vista o il controller.
Modifichiamo quindi il modello in app/models/message.rb
in questo modo:
class Message < ActiveRecord::Base
belongs_to :author
belongs_to :topic
def self.latest
find :all,
:order=>"created_at DESC",
:limit=> 10
end
end
Il metodo latest
è definito con un self
davanti. I metodi definiti in questo modo sono metodi di classe, come find
o new
che abbiamo già visto. Possiamo vedere anche alcune altre possibilità nell'uso di find
, ovvero la scelta di inserire informazioni aggiuntive nella query di ricerca, usando come sempre degli argomenti opzionali passati per nome. In particolare, gli argomenti order
e limit
riflettono esattamente i meccanismi SQL sottostanti ed esprimono funzionalità piuttosto semplici per selezionare un numero preciso di risultati ordinati in base ad una precisa clausola (in questo caso selezionando gli ultimi in ordine di creazione).
Disabilitare il layout
Se però ora provate a visualizzare questo file, vi troverete di fronte ad un problema: intorno al nostro XML troviamo di nuovo il layout dell'applicazione, il che lo rende codice non valido. Fortunatamente come abbiamo già detto parlando dei layout, è possibile effettuare un'impostazione più precisa agendo a livello di singolo controller o di singola azione. In particolare, è possibile impostare un layout specificamente per un controller usando il metodo di classe layout
:
class MyController < ApplicationController
layout "mylayout"
end
Anche questo metodo offre diverse possibilità, come il poter usare argomenti opzionali :except
ed :only
(con comportamento identico a quanto già visto per before_filter
). Poiché stiamo parlando di template rxml, è giusto anche far notare come sia possibile scrivere dei layout in rxml, anche se è una pratica decisamente inusuale.
Per far sì che il nostro controller non usi nessun layout per nessuna delle sue viste (in quanto progettiamo di usare solo azioni che forniscano file xml per aggregatori di feed, e non html per i browser), è sufficiente aggiungere una linea come questa a feed_controller.rb
:
layout nil