2

私のコントローラー仕様では、次の行を実行すると:

  post :register_pass, :device_id => 'DEV1C3', :pass_type_id => 'pass.com.example.GSPassType', :serial_no => '5ER14L'

私は得るActionController::RoutingError

  Failure/Error: post :register_pass, :device_id => 'DEV1C3', :pass_type_id => 'pass.com.example.GSPassType', :serial_no => '5ER14L'
  ActionController::RoutingError:
   No route matches {:action=>"register_pass", :controller=>"purchases/passbook/registrations", :pass_type_id=>"pass.com.example.GSPassType", :serial_no=>"5ER14L", :device_id=>"DEV1C3"}

rake routes | grep register_pass返品しても

register_pass POST   /v1/devices/:device_id/registrations/:pass_type_id/:serial_no(.:format)        {:action=>"register_pass", :controller=>"purchases/passbook/registrations"}

ただし、:pass_type_id値のピリオドを削除postすると、上記の行が実行され、ルートが認識されます (rspec を使用してこれを確認し、予想されるコントローラー アクションにブレークポイントを配置して、ルートが機能することを確認しました)。

ピリオド付きの値を使用しようとしRack::Utils.escapeましたが、それも失敗しました。また、ピリオドを URL エンコードされた値に手動で変更しようとしましたが、レールは params ハッシュでピリオドをデコードしていないようです。

この場合、なぜピリオドが機能しないのですか?

String#gsubまた、ピリオドが渡された値を取得するにはどうすればよいですか (コントローラーで手動でデコードする必要はありませんか?

4

1 に答える 1

2

あなたが遭遇している2Rack::Utils.escapeつの問題があります. URI.escape.json、.xml などの URL ( で定義ActionController::Routing::SEPARATORS)。

このユースケースでは、このルートに制約を追加して、 の任意の文字を許容できるようにすることをお勧めします:post_id。あなたのルートファイルがどのように見えるかわかりませんが、変更すると次のようになる可能性があります:

post "/v1/devices/:device_id/registrations/:pass_type_id/:serial_no(.:format)" => 
  "purchases/passbook/registrations#register_pass", 
  :constraints => { :pass_type_id => /.*/ }

ルーティングに関する Rails ガイドには、この制約を追加する他の方法に関する多くの優れた情報があります。

于 2012-10-05T23:12:44.817 に答える