6

Sinatra でパラメータをデフォルトにする方法はありますか?

現在、パラメータとして渡されたかどうかを調べてい'start'ますが、少しハッキーなようです。特定のパラメータが指定されていない場合、デフォルトにするように Sinatra に指示できればいいのですが。

get '/comments/?' do
   # want to setup page stuff, default to first page if not specified
   params[:start] = 0 if !params[:start] 
end

何か案は?

4

2 に答える 2

5

このように使用できるのは事実ですが、パラメーター取得して||=から設定するのは非常に奇妙なことです。パラメータから変数を設定する可能性が高くなります。したがって、これの代わりに:

params[:start] ||= 0

確かにあなたはこれをしている可能性が高いです:

start = params[:start] || 0

それを行う場合は、フェッチを使用することをお勧めします

start = params.fetch :start, 0

ルートの前にパラメーター ハッシュのデフォルト値を本当に探している場合は、 before フィルターを使用します。

before "/comments/?" do
  params[:start] ||= 0
end

アップデート:

ルート パターンからパラメーターを取得する場合、ブロック パラメーターを使用して既定の引数を指定できます。これは、Ruby (v1.9 以降) がブロックの既定のパラメーターを取得できるためです。

get "/comments/:start/?" do |start=0|
  # rest of code here
end

startパラメーターは、ローカル変数 (ブロックに指定) または (ルートの詳細についてはドキュメントを参照) を介してstart利用できparams[:captures].firstます。


さらに更新:

ルートを動詞メソッド (例: get) に渡すと、Sinatra はそのルートを使用して着信要求を照合します。一致するリクエストは指定されたブロックを起動するため、いくつかのデフォルトが必要であることを明確にする簡単な方法は次のとおりです。

get "/comments/?" do
  defaults = {start: 10, finish: 20}
  params = defaults.merge params
  # more code follows…
end

見た目をすっきりさせたい場合は、ヘルパーを使用します。

helpers do
  def set_defaults( defaults={} )
    warn "Entering set_defaults"
    # stringify_keys!
    h = defaults.each_with_object({}) do |(k,v),h|
      h[k.to_s] = defaults[k]
    end
    params.merge!( h.merge params )
  end
end

get "/comments/?" do
  set_defaults start: 10, finish: 20
  # more code follows…
end

もっと重いものが必要な場合は、sinatra-paramを試してください。


Sinatra::DefaultParameters ジェム

このコードがとても気に入ったので、gem にしました

于 2013-02-14T22:22:34.410 に答える
1

ここで「または等号」演算子を使用できます。params[:start] ||= 0

http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

于 2013-02-14T20:29:13.033 に答える