1

Railsを使用してAPIを構築しようとしています。このAPIは、requestヘッダーを検査し、"If-Modified-Since"その日付を過ぎて変更されたオブジェクトのみをレンダリングします。問題は、コントローラーのリクエストヘッダーから値を取得しようとして立ち往生していることです。

# API
def index
   @products = Product.where{updated_at > request.headers["If-Modified-Since"]}
   render "v1/products/index"
end

リクエストヘッダーから値を抽出する正しい方法は何ですか?

4

3 に答える 3

5

1つ目:If-Modified-SinceHTTPキャッシュ検証用です。このように使用しないでください。代わりにパラメータを使用してください。

あなたの質問に答えるにrequest.headers[]は:リクエストヘッダーにアクセスする適切な方法です。参考までに、requestActionDispatch::Requestオブジェクトです。

ここでの問題は、制約をどのように表現しようとしているのかということです。ActiveRecordブロックをのメソッドに渡していますが#where、そのブロックは意味がありません(Symbol#>(String)?)。これは、次のようにSQLフラグメントとして表現できます。

Product.where("updated_at > ?", params[:last_update])

または、 Squeelに立ち寄って、次のように書くこともできます。

Product.where{ updated_at > params[:last_update] }
于 2012-10-11T05:53:19.700 に答える
3

W3 仕様によると、If-Modified-Since を使用する方法は完全に有効です。[1]ここにいる他のレスポンダーは、それが非標準である、またはキャッシュが破損するという点で間違っています。これはあまり RESTful ではなく、データ内に状態情報 (GET パラメーターなど) を含めることはお勧めしません。

質問に答えるにはstale?、304 (変更されていない場合) を生成するか、実際のコンテンツを生成するために使用できます。次に例を示します。

def index
  if_modified_since = request.headers['If-Modified-Since'] || DateTime.new
  @items = Item.where("updated_at > ?", if_modified_since).order(updated_at: :desc)
  if stale?(@items.first)
    render json: @items
  end
end

これは、@items に常にアイテムが含まれていることを前提としていることに注意してください。常に何かを返すとは限らない場合は、ニーズに合わせて調整できます。

于 2013-11-14T05:31:56.320 に答える
1

request.if_modified_sinceまたrequest.headers["HTTP_IF_MODIFIED_SINCE"]

これはヘッダーの非標準的な使用法であることに注意してください。これは通常、If-Modified-Sinceで指定された時間以降にページのコンテンツが変更されたかどうか示し、変更されたコンテンツのみをページに含める必要があるわけではありません。

この方法にも興味があるかもしれませんstale?

于 2012-10-11T05:51:17.567 に答える