2011-08-09 12 views
1

単純なAPIを使っているので、私の:idのパラメータが文字列であり、整数値と比較していたのでルーティングテストが失敗していることに気付きました。 routes.rb経由でリクエストパラメータを何らかの形で自動的にキャストする方法はありますか?レールでキャストする経路のパラメータ

namespace :api do 
    namespace :v1 do 
    scope '/profile' do 
     get ':id' => 'users#show', :id => /\d+/ 
    end 
    end 
end 

答えて

3

簡単な例from here

例えば、以下のルート(/プロファイル/ 1)与えられた、私は params[:id]は整数(1)ではなく、文字列( "1")になりたいです
match '/:id' => 'posts#show', :constraints => {:id => /^\d/} 

次に、あなたが明示的にキャストするコントローラのアクションに

params[:id].to_i 

を行う必要があるだろう。 routes.rbでRailsがparamsをどのように収集するのかを猿のように修正することなく、直接これを行う別の方法があるかどうかはわかりません。

Ruby on Rails Guides

から撮影:

のparamsの値を[:IDS]は今[ "3"、 "1"、 "2"]であろう。パラメータ値は常に文字列であることに注意してください。 Railsは型を推測したりキャストしようとしません。

+0

これは、値が文字列のような整数であることを確認しますが、実際に整数にどのようにリキャストされるのかはわかりません。 – DGM

+1

Railsを猿のパッチなしで実行する方法はないようです。更新された回答をご覧ください。 – iwasrobbed

+1

とにかくその入力を消毒して、それを行ってもキャストを決してしてはいけないと思います。 – typeoneerror

関連する問題