6

私はこのトピックに関連するいくつかの投稿を見ましたが、与えられた解決策は私にとって本当に物事を明確にしませんでした...

そのため、MichaelHartlのRubyon Railsチュートリアルのセットアップに従ったRails(バージョン3.2.2)アプリケーションに取り組んでいます。アプリケーションにはサインアウトリンクがあり、最近まで「ルートが[GET]"/signout"に一致しません」というエラーが表示され始めました。

これらは関連する部分です:

ルート.rb

match '/signout' => 'sessions#destroy', :via => :delete

session_controller.rb

def destroy
  sign_out
  redirect_to root_path
end

session_helper.rb

def sign_out
  current_user = nil
  cookies.delete(:remember_token)
end

_header.html.erb

<li>
  <%= link_to "Sign out", signout_path, :method => :delete %>
</li>

サインアウトが再び機能し始めるのに必要なのは、ルートファイルから「:via =>:delete」を削除することだけです。これは正しいアプローチですか、それともより良いアプローチがありますか?また、レールが更新されないままリンクが機能しなくなったのはなぜですか?

ありがとう、アレクサンドラ

リクエストに応じて、_header.html.erbの完全なコードを追加しました。

フル_header.html.erb

<!-- ***** Initialized: Listing 5.24 ***** -->
<!-- ***** Updated: Listing 8.24 ***** -->
<!-- ***** Updated: Listing 9.7 ***** -->
<!-- ***** Begin: Listing 9.28 ***** -->
<header>
<header class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container">
      <% if signed_in? %>
        <%= link_to "project manager", about_path, id: "logo" %>
      <% else %>
        <%= link_to "project manager", root_path, id: "logo" %>
      <% end %>
      <nav>
        <ul class="nav pull-right">
          <!--li><%= link_to "Home", root_path %></li-->
          <% if signed_in? %>

<% if Rails.env.development? %>
            <li><%= link_to "Overview", overview_path %></li> 
<% end %>         
<% if Rails.env.development? %>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Projects <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
              <li><%= link_to "Status", projects_path %></li>
              <li><%= link_to "Dev View", dev_projects_path %></li>
              </ul>
            </li>
<% else %>
          <li><%= link_to "Projects", projects_path %></li>
<% end %>
<% if Rails.env.development? %>
            <li><%= link_to "Teams", teams_path %></li> 
<% end %>
<% if Rails.env.development? %>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Tasks <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
              <li><%= link_to "Status", tasks_status_path %></li>
              <li><%= link_to "Tree", tasks_tree_path %></li>
              <li><%= link_to "Dev View", dev_tasks_path %></li>
              </ul>
            </li>
<% else %>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Tasks <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
              <li><%= link_to "Status View", tasks_status_path %></li>
              <li><%= link_to "Tree View", tasks_tree_path %></li>
              </ul>
            </li>
<% end %>

<% if Rails.env.development? %>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Reports <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
              <li><%= link_to "Project Progress", analysis_path %></li>
              <li><%= link_to "Revision History", history_path %></li>
              </ul>
            </li>              
<% else %>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Reports <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
              <li><%= link_to "Revision History", history_path %></li>
              </ul>
            </li>
<% end %>
<% if Rails.env.development? %>
            <li><%= link_to "Help", help_path %></li>
<% end %>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Account <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
<% if current_user.admin? %>
                <li><%= link_to "Admin", users_path %></li> 
<% end %>
<% if Rails.env.development? %>
                <li><%= link_to "Profile", current_user %></li>
<% end %>
                <li><%= link_to "Settings", edit_user_path(current_user) %></li>
                <li class="divider"></li>
                <li>
                  <%= link_to "Sign out", signout_path, :method => :delete %>
                </li>
              </ul>
            </li>
          <% else %>
            <li><%= link_to "Sign in", signin_path %></li>
          <% end %>
        </ul>
      </nav>
    </div>
  </div>
</header>
<!-- ***** End: Listing 9.28 ***** -->
4

8 に答える 8

14

このスレッドは少し古いですが、同じ問題を抱えている人が増える可能性があるので、とにかく解決策を共有したいと思いました。

実際のトラブルシューティングに入る前に、これがどのように機能するかについての背景情報を次に示します。

サインアウトリンクは次のようになっていることに注意してください。

<%= link_to "Sign out", signout_path, :method "delete" %> 

このタグによって生成されたソースコードを見ると、次のことがわかります。

<a href="/signout" data-method="delete" rel="nofollow">Sign out</a>

と書かれている部分に注目してくださいdata-method="delete"。ストレートHTMLでは、これは機能しません。リンクをクリックすると、ブラウザはDELETE命令を無視し、代わりにGETリクエストをサーバーに送信します(これは現在ログに表示されているものです)。ブラウザにDELETEリクエストを送信させるには、JavaScriptの魔法を使用する必要があります。これがjquery_ujs.jsファイルの出番です(ブラウザでソースを表示すると、このファイルへのリンクが表示される可能性があります。このファイルは、ヘッダーにあるか、application.jsファイルの近くにあるか、application.jsファイルに含まれている必要があります)。 。jquery_ujs.jsファイルの内部をファイルの中央に向かって見ると、次のコードが表示されます。

// Handles "data-method" on links such as:
// <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a>

つまり、上記のコードは、ブラウザが実際にDELETEリクエストを送信することを確認します(実際のコードの詳細をここで確認する必要はありません)。

この背景情報を考えると、エラーが発生する理由は2つ考えられます。

  1. jquery_ujs.jsファイルが欠落しているだけです

  2. あなたが書いた、または含めた他のJavaScriptコードは、jquery_ujs.jsファイルの望ましい動作を妨げています

トラブルシューティングするには、次のようにします。

  1. 1)サインアウトリンクを含むページをロードし、ブラウザから[ソースの表示]を選択します。ファイルjquery_ujs.jsがヘッダーに含まれていることを確認します(または、アプリケーションの設定によっては、残りのJSファイルと連結してapplication.jsファイルに入れます)。

  2. //=require_tree .2)application.jsで、ディレクティブを削除します。ページをリロードし、[サインアウト]リンクをクリックします。サインアウトリンクが、JavaScriptがインストールされている場合にのみ機能するメニューの下に隠れている場合は、JavaScriptなしでアクセスできるページの別の場所にサインアウトリンクの複製を配置するだけです。リンクをクリックしてみてください-うまくいけばうまくいくはずです。ルーティングエラーが発生しなくなった場合は、これが問題の原因であることがわかります。これをトラブルシューティングする最も簡単な方法は、//=require_tree .ただし、application.jsファイルを除くすべてのJavaScriptファイルをそれらが存在するフォルダーから削除し、[サインアウト]リンクを試している間に、機能しなくなるまで各ファイルを1つずつ追加し直します。これにより、トラブルメーカーのJavaScriptファイルを特定できます。このファイルを特定したら、すべてのコードを削除して(リンクが再び機能するはずです)、機能しなくなるまでコードの一部を追加し直してください。これで、問題の原因が特定されました。お気軽にご報告ください。私の推測では、それはまっすぐなエラー、return false;ステートメント、またはステートメントのいずれかである可能性がありますstopPropagation();

うまくいけば、これはうまくいくでしょう!幸運を。

于 2013-01-06T10:35:15.330 に答える
3

2012年9月に受け取った回答では問題が解決しなかったため、ルートファイルから「:via =>:delete」を削除することになり、サインアウトリンクが再び機能するようになりました。

eriklindeの答えを読んだ後、私は自分のコードに戻って、彼の答えが役立つかどうかを確認しました。jquery_ujs.jsファイルがありませんでした。それで、私は提案された2番目の考えられる理由を調べ始めました。それでも、routes.rbファイルに移動し、「via :: delete」を追加して、「match'/ signout'、:to =>'sessions#destroy'、via::delete」という行を追加すると、サインアウト機能になります。問題なく作業を続けました。「via::delete」は以前に削除した「:via =>:delete 」とは異なるので、これが問題の原因だったのでしょうか。

于 2013-01-06T19:08:24.947 に答える
2

解決策はここにあると思います: Rails 3 link_to(:method =>:delete)が機能していません

ページに<%= javascript_include_tag:all%>がありませんか?レイアウトファイルに入れる必要があります。

于 2012-09-07T15:57:51.510 に答える
2

私はこれと同じ問題を抱えていて、application.jsファイルの要件の順序を並べ替えることで修正しました。鉱山はそのように注文されました:

//= require jquery_ujs
//= require jquery
//= require bootstrap
//= require_tree .

そして今このように注文されています

//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require_tree .

私は文字通り他に何もしませんでした。

于 2013-02-08T05:11:18.020 に答える
0

_header.html.erb部分をに変更してみてください

<li> 
  <%= link_to "Sign out", signout_path, :method "delete" %> 
</li> 
于 2012-09-07T16:02:33.400 に答える
0

実際には、クロスサイト偽造保護タグが欠落している可能性があります。これは、deleteメソッドを介して削除できないことを説明します。以前はなぜ機能していたのかわかりません。

これをヘッドセクションのレイアウトファイルに追加します

hamlの場合

= csrf_meta_tags

erb用

<%= csrf_meta_tags %>
于 2012-09-07T16:31:49.517 に答える
0

私の推測では、どういうわけか、jQueryUJSがインストール/アクティブになっていないと思います。

ここにリストされている重要な機能の1つは、「ハイパーリンクから非GET要求を行う」ことです。gem 'jquery-rails'gemfileに追加してbundle install、コマンドラインから実行し、サーバーを再起動して、機能するかどうかを確認してください。

これは、application.jsファイルに含まれている必要があります(//で始まらない行は上にありません!)

//= require jquery
//= require jquery_ujs
于 2012-09-07T18:21:28.530 に答える
0

これを試して :

application.jsを追加するだけです

//= require jquery_ujs
于 2016-12-04T18:49:58.333 に答える