Ruby on Railsをいじり始めたところ、特定のビューからコントローラー内の別のアクションにリンクする際に問題が発生しました。私はroutes.rb
ファイルの問題(またはコードの欠如)であることはほぼ確実ですが、このファイルがどのように機能し、何をしなければならないかを正確に誤解していると思います。解決策はありますが、そうではないと確信しています。それを行うための「最良の方法」。
home
(デフォルト)とindex
の2つのアクションを持つnewbill
というコントローラーが1つあります。 index.html.erb
の中に私は持っています:
<h1>Home View</h1>
<%= link_to "new", :controller => "home", :action => "newbill" %>
ただし、ルーティングエラーが発生していました。
No route matches {:controller=>"home", :action=>"newbill"}
rake routes
を実行すると、次のようになります。
root / {:controller=>"home", :action=>"index"}
次に(グーグルに続いて)このコードをroutes.rb
に追加しました
match 'home/newbill' => 'home#newbill', :as => :newbill
そして、私のindex.html.erb
にこれがあります:
<%= link_to "Name", newbill_path %>
そして今、これは期待どおりに機能します。しかし、私の質問は次のとおりです。
match 'home/newbill'...
を追加することは、物事を行うためのごちゃごちゃした方法のようです。私はRubyが本当に好きですが、Railsのこの側面に少し苦労しています...一般的にルーティングは私の頭を少し混乱させていると思います!
どんな助けでも大歓迎です:D
ありがとう、
ジャック
レールルーティングガイド を確認する必要があります。読み飛ばしは、舞台裏で何が起こっているのかを理解するのに役立ちます。
home
コントローラーがリソースとして定義されているため、初めてコードが機能しなかったと思います。
コントローラーをroutes.rb
ファイルのリソースとして定義すると、7つの標準メソッドのみがサポートされます(RESTアーキテクチャーによる):
index
new
create
show
edit
update
destroy
さらにカスタムルートが必要な場合は、手動で追加する必要があります。たとえば、「newbill」の場合は、次のようになります。
resources :home do
collection do
get :newbill
end
end
しかし、私の理解によれば、newbillメソッドはbills
コントローラーnew
に移動する必要があります。これは、ホームコントローラーにはないメソッドです。
あなたは正しいです、Railsルートは(少なくとも私にとっては)少し混乱していますが、理解すればたくさんのクールなことができます。
Rails公式ルートのドキュメントについてはこちらをお読みください:
これは、Railsがルーターを介してすべてのリクエストをフィルタリングし、一致するものを探すために機能します。これにより、パスが実際にblog#postである場合に、domain.com/postなどのカスタムルートを定義できます。 Rails 3、キャッチオールルートはルートファイルの最後のルートでした。これにより、コントローラーとアクションを定義でき、それで問題なく動作します。私はiPadを使用していますが、近くにはありません。プロジェクトなので、確認できませんが、ルートはまだRails 3.1にあると思います、コメントする必要があります。