2013-11-14 2 views
8

Можно ли использовать stale? с коллекцией? Например, я разрабатываю REST api, который позволит клиенту иногда запрашивать у сервера запрос самого актуального списка элементов. Было бы неплохо, если бы stale? мог проверить коллекцию против моего заголовка If-Modified .. и отправить 304, если ничего не изменилось.Возможно использование устаревшего метода для коллекций?

Быстрый пример:

def index 
    @items = Item.all 
    if stale?(@items) 
    render json: @items 
    end 
end 

def show 
    if stale?(@item) 
    render json: @item 
    end 
end 

ответ

2

Вы можете сделать это как то

stale?(@items, last_modified: @items.order('updated_at ASC').last) 

Второй параметр, хэш называется additional_options внутри, передается fresh_when метод, который затем делает

{ etag: record, last_modified: record.try(:updated_at) }.merge!(additional_options) 

где запись первая arg, @items в вас r случае, поэтому, пройдя last_modified значение, вы можете его переписать. Я не уверен, что касается самого заголовка etag, но это все равно стоит попробовать.

EDIT:

Поэтому я проверил это и Rails считает ответ свежий/не просроченным, если либо Etag отличается или последнего изменения больше, чем требуется.

+1

@parazuce сделал эту работу для вас? –

+1

'@ items.last.updated_at' может быть проблемой, если вы измените первый элемент. Лучше пойти на что-то вроде '@ items.order (: updated_at) .last' – gabrielhilal

+0

@gabrielhilal хорошая точка, не стесняйтесь редактировать мой ответ :) –

4

Для Rails < 5:

stale?(last_modified: @items.maximum(:updated_at)) 

Для Rails> = 5 раз:

stale?(@items) 
Смежные вопросы