web-dev-qa-db-ja.com

Rails)のマッチングとルート

コントローラを生成してルートを変更しましたが、リンクを開くとローカルサーバーでエラーが発生します。

コントローラーとルートの生成

Rails generate controller StaticPages home about team contact

routes.rbを変更

MyApp::Application.routes.draw do
  root to: 'static_pages#home'

  match '/about',    to: 'static_pages#about'
  match '/team',     to: 'static_pages#team'
  match '/contact',  to: 'static_pages#contact'
end

ルートパスは機能しますが、「about」、「team」、または「contact」リンクは機能しません。これは私が得るエラーです:

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

'match'を使用できないのはなぜですか?

12
megashigger

matchメソッドは非推奨になりました。

GETにはgetを使用し、POSTにはpostを使用します。

get '/about', to: 'static_pages#about'

27
Jason Kim

matchを使用できますが、via:オプションを追加する必要があります。

match '/about',    to: 'static_pages#about', via: :get
match '/team',     to: 'static_pages#team', via: :get
match '/contact',  to: 'static_pages#contact', via: :get

必要に応じて、via:のように他のHTTP動詞をvia: [:get, :post]に渡すこともできます。

出典: Railsルーティングガイド

13
user2062950

まず、via: :getの最後にmatch 'st' => 'controller#actionを追加してHTTPメソッドを指定する必要があります

そして、get '/home', to: 'static_pages#home'を使用することをお勧めします

ただし、コードがRESTfulに準拠しておらず、インデックス、新規、編集、作成、更新、表示、破棄の7つのアクションしかサポートしていないという問題があります。

これらは2つの解決策です:

SOL 1:それらを異なるコントローラー(家、約..)に置き、これらのコントローラーはすべてアクションindexを持ちます。

SOL 2:作業が多すぎる場合は、それらをshowアクションに一致させることができます。 static_pagesコントローラーを使用し、各ページ(home、about)がアイテムになります。

ルートは/static_pages/home /static_pages/aboutのようになります

接頭辞static_pagesが原因で良くないことはわかっています。

ルートファイルの最後にカスタムルートを追加することで、これを簡単に取り除くことができます。

get '/:id', to: 'static_pages#show'

それでおしまい。そして、あなたがそれがあまりにも多くの仕事だと思うなら(私もそう思います)、この宝石をチェックしてください 高電圧 。楽しんで。

0
duykhoa