1

したがって、routes.rbに次の行があり match 'calculate' => 'index#calculate' 、インデックスページをロードしようとするとエラーが発生します。

matchHTTP メソッドを指定せずにルーターでメソッドを使用しないでください。アクションを GET と POST の両方に公開する場合は、via: [:get, :post]オプションを追加します。アクションを GET に公開する場合getは、ルーターで次を使用します。代わりに: match "controller#action" Do: get "controller#action"

基本的には、フォームから数値を取得し、計算を行った後に数値を出力する単純なアプリです。しかし、私は今このエラーで立ち往生しています...

どうすればこのエラーを克服できますか?

4

3 に答える 3

0

このエラーは Rails 4 でスローされます。これは、十分に注意しないと、match を使用するとクロス サイト スクリプティング (XSS) のルートが開かれるためです。説明から実際に必要なルートを判断するのは難しいですが、フォームを送信する場合は、最初にフォームをロードするための get ルートと、フォーム データが送信される場所としての post ルートが必要な場合がほとんどです。 .

このエラーを修正するには、エラー メッセージの指示に従い、次のいずれかを使用します。

match 'calculate' => 'index#calculate', via: [:get, :post]

また

get 'calculate' => 'index#calculate'

必要なルートに応じて。

于 2013-10-15T23:07:47.770 に答える
0

あなたが探しています:

match 'calculate', :to => 'index#calculate'

これにより、GET ルートと POST ルートの両方が作成されます。両方が必要でない限り、「一致」を使用する必要はありません。あなたがやろうとしていることは、おそらく GET ルートが必要なだけです:

get 'calculate' => 'index#calculate'
于 2013-10-16T03:32:35.550 に答える
0

このエラーを解決するには、ステートメントmatchをステートメントに置き換えますget

Replace:

match 'calculate' => 'index#calculate'

With:

get 'calculate' => 'index#calculate'

getRailsがより一般的なものではなく使用することを提案する理由はmatch、意識的な API 設計の決定を強制することによってセキュリティを向上させるためです。GET リクエストは POST リクエストとは異なります。POST は「変更」を意味します。その要求が何かを変更すると、システムが変更されます。GET は「このページを渡す」という意味です。何も変わりません。

エンドポイントが何らかの計算の結果を返すと思います。計算しても何も変わらないので、GET リクエストを使用するのがよいと主張するかもしれません。また、このエンドポイントは同じ入力に対して常に同じ値を返すとは限らないと主張することもできます (おそらく?) その場合、一意のリソースを取得していないため、これは POST であると言うことができます。

これはあなたが作っているテストアプリだと思います。レールのどの側面に焦点を当てて学習したいかによって、どちらかを選択するか、両方を実装して変更点を確認するか、単にコインを投げることができます :)

このmatch方法は、以前はあなたが使用した方法で機能していましたが、Rails 4 以降、この明示性を必要とするように変更されました。

ドキュメント: http://guides.rubyonrails.org/routing.html#http-verb-constraints

于 2013-10-15T23:10:05.027 に答える