2

Railsのキャッチオールではないトップレベルのルートを使用するという哲学と技術的実践の両方についてのフィードバックを探しています。

例:

# routes.rb
get '/cities' => 'cities#index'
get '/:city_id' => 'cities#show', as: :city, city_id:/([a-z\-\d]+)/

:city_idは「/los-angeles」のようなものに制限されるべきであるが「/somewrongthing.jpg」のようなものに制限されるべきではない約30kの都市があります。これが最後のルートなので、ちょっとしたキャッチオールになっています。現在、都市が見つからない場合は404をレンダリングしていますが、これは、欠落しているリンクが通過するたびにDBがヒットすることを意味します。制約によって制限しましたが、私が望んでいたエレガントなソリューションではありませんでした。

/ city /:city_idのようなものの下に置く以外に解決策はありますか?

4

1 に答える 1

3

ルート自体でこれを処理する代わりに、いくつかの代替案を検討する必要があると思います。30,000のルートは、RAMの問題をDBの問題と交換するだけです。たぶん、あなたは都市のキャッシュとして機能することができるいくつかのプレーンなルビーオブジェクト(ファイルで裏付けられているかもしれませんか?)を持っていて、あなたの都市ルートに落ちるすべてのリクエストでそれをクエリします。

このようなもの、多分?

# in config/routes.rb
get '/:city' => 'cities#show', constraints: CityConstraint.new

# in lib/city_constraint.rb
class CityConstraint
  def matches?(request)
    city_valid?(request.params[:city])
  end

  private

  def city_valid?(city)
    # I dunno.. Redis, look it up in a text file, hash, etc.
    # ..look it up in activerecord and cache it at startup?
    # or whatever...
  end
end
于 2012-07-31T21:22:08.860 に答える