QA@IT

railsでのアプリ開発でnavbarについて

3767 PV

app/view/loyouts/application.erbにてヘッダーにnavbarをつけたくて、


<%= link_to "New", "log/new" %>
<%= link_to "Event","welcome" %>
<% user_id = current_user.id %>
<%= link_to "Mypage", "users/#{user_id}"%>
<%= link_to "Group","group" %>


と今書いているのですが、例えばNewをクリックした後にEventをクリックしたら
"localhost:3000/welcome"が呼び出されるのではなく、
"localhost:3000/log/welcome"と呼び出されてしまい、思うようにルーティングがうまくいきません。
Groupをクリックした後にWelcomeをクリックすれば
"localhost:3000/group"の後正常に"localhost:3000/welcome"に移動します。
原因と解決策を教えてください。

回答

原因はリンク先のアドレスがすべて相対パスで記述されているので、現在位置からの移動になっているためです。

例えば
http://URL/ の状態から
Newをクリックして遷移すると
http://URL/log/new です。
この場合現在位置は http://URL/log/なので
そこを基準に移動していることになります。
(ここでnewを押せば http://URL/log/ + log/new なので http://URL/log/log/new です)

対策はいくつかありますが、

一般的なWebの話で言えば
たとえば

<%= link_to "New", "/log/new" %>
<%= link_to "Event","/welcome" %>

と スラッシュ始まりにすれば、ルートパスからになるので

http://URL/log/new から http://URL/welcome に遷移します。
ただルートディレクトリ ( / が示す場所 ) がどう解釈されるかによるので注意してください。

相対パスについては「相対パス」「相対URL」などで調べるといろいろ出てくると思います。

なお、自アプリ内の遷移について

<%= link_to "New", "http://localhost:3000/log/new" %>

という http:// から始まる指定はいけません。
localhostが自PCを指す特別な表現であることと、きちんとしたドメイン名、サーバー名を指定していてもアプリを置くサーバーのアドレスが変わるたびに直さないといけないからです。

(外部のサーバーへのリンクはこの限りではありません)


railsの場合、 link_to には controllerとactionが指定できますので、

/log/new が log コントローラ の new アクションなら

<%= link_to "New", :controller => "log", :action => "new" %>

というような指定も可能です。

Railsドキュメント link_to


それ以外では config/routes.rb の設定にもよりますが、名前付きパスという
*_path 形式の変数が用意されている場合があります。

コマンドで $ rake routes か、 開発環境でhttp://localhost:3000/rails/info/routes とすれば確認できたと思います(後者は Rails 4から?)。

それがあれば

<%= link_to "New", new_log_path %>
<%= link_to "Event", event_path %>

の様な指定ができます

編集 履歴 (0)
  • 大変ご丁寧にありがとうございました。
    十分理解することができました!
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。