web-dev-qa-db-ja.com

Ruby on Rails link_toを使用してコントローラーアクションにリンクする

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 %>

そして今、これは期待どおりに機能します。しかし、私の質問は次のとおりです。

  1. なぜこれが機能するのですか?舞台裏で正確に何が起こっているのですか?
  2. 確かにこれはそれを行うための最良の方法ではありませんか?リンクしたいすべてのコントローラー/アクションに別のmatch 'home/newbill'...を追加することは、物事を行うためのごちゃごちゃした方法のようです。

私はRubyが本当に好きですが、Railsのこの側面に少し苦労しています...一般的にルーティングは私の頭を少し混乱させていると思います!

どんな助けでも大歓迎です:D

ありがとう、

ジャック

13
Jack Franklin

レールルーティングガイド を確認する必要があります。読み飛ばしは、舞台裏で何が起こっているのかを理解するのに役立ちます。

6
Brett Bender

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公式ルートのドキュメントについてはこちらをお読みください:

http://guides.rubyonrails.org/routing.html

8
sameera207

これは、Railsがルーターを介してすべてのリクエストをフィルタリングし、一致するものを探すために機能します。これにより、パスが実際にblog#postである場合に、domain.com/postなどのカスタムルートを定義できます。 Rails 3、キャッチオールルートはルートファイルの最後のルートでした。これにより、コントローラーとアクションを定義でき、それで問題なく動作します。私はiPadを使用していますが、近くにはありません。プロジェクトなので、確認できませんが、ルートはまだRails 3.1にあると思います、コメントする必要があります。

0
Scott Radcliff