web-dev-qa-db-ja.com

Ruby on Rails-デバイスユーザー/ sign_outが機能しない

私はデバイスを使用していますsign_insign_upのURLは機能しています

しかし、私がURLを試してみると:http://localhost:3000/users/sign_out

ルーティングエラーが発生します

No route matches [GET] "/users/sign_out"

どうすればこれを修正できますか?

レーキルート

rake routes
        new_user_session GET    /users/sign_in(.:format)           {:action=>"new", :controller=>"devise/sessions"}
            user_session POST   /users/sign_in(.:format)           {:action=>"create", :controller=>"devise/sessions"}
    destroy_user_session DELETE /users/sign_out(.:format)          {:action=>"destroy", :controller=>"devise/sessions"}
           user_password POST   /users/password(.:format)          {:action=>"create", :controller=>"devise/passwords"}
       new_user_password GET    /users/password/new(.:format)      {:action=>"new", :controller=>"devise/passwords"}
      edit_user_password GET    /users/password/edit(.:format)     {:action=>"edit", :controller=>"devise/passwords"}
                         PUT    /users/password(.:format)          {:action=>"update", :controller=>"devise/passwords"}
cancel_user_registration GET    /users/cancel(.:format)            {:action=>"cancel", :controller=>"devise/registrations"}
       user_registration POST   /users(.:format)                   {:action=>"create", :controller=>"devise/registrations"}
   new_user_registration GET    /users/sign_up(.:format)           {:action=>"new", :controller=>"devise/registrations"}
  edit_user_registration GET    /users/edit(.:format)              {:action=>"edit", :controller=>"devise/registrations"}
                         PUT    /users(.:format)                   {:action=>"update", :controller=>"devise/registrations"}
                         DELETE /users(.:format)                   {:action=>"destroy", :controller=>"devise/registrations"}
    status_message_index GET    /status_message(.:format)          {:action=>"index", :controller=>"status_message"}
                         POST   /status_message(.:format)          {:action=>"create", :controller=>"status_message"}
      new_status_message GET    /status_message/new(.:format)      {:action=>"new", :controller=>"status_message"}
     edit_status_message GET    /status_message/:id/edit(.:format) {:action=>"edit", :controller=>"status_message"}
          status_message GET    /status_message/:id(.:format)      {:action=>"show", :controller=>"status_message"}
                         PUT    /status_message/:id(.:format)      {:action=>"update", :controller=>"status_message"}
                         DELETE /status_message/:id(.:format)      {:action=>"destroy", :controller=>"status_message"}
                    home        /home(.:format)                    {:action=>"index", :controller=>"status_message"}
                    root        /                                  {:controller=>"home", :action=>"index"}

routers.rb

Microblog::Application.routes.draw do
  devise_for :users, :controllers => {:migrations => "users/registrations"}
  resources 'status_message'
  match 'home' => 'status_message#index'
  root :to => 'home#index'
end
20
Sayuj

エラーの理由は、GETHTTPメソッドを使用してルートにアクセスできないためです。 rake routes出力で関連する行がどのように表示されるかに注意してください。

destroy_user_session DELETE /users/sign_out(.:format)

つまり、ユーザーをログアウトする場合は、そのURLにDELETEリクエストを送信する必要があります。 Railsでは、次のようにするリンクを生成できます。

link_to 'Sign out', destroy_user_session_path, :method => :delete

# alternatively (although NOT recommended):

link_to 'Sign out', '/users/sign_out', :method => :delete

重要な部分は:method => :deleteです。 DELETEリクエストはブラウザでは実際にはサポートされていないことに注意してください。Railsは実際にはデータをPOSTしていますが、DELETEメソッドをシミュレートする特別なパラメータを送信します。

この背後にある理由は、「サインアウト」URLが現在のユーザーをログアウトさせるものであり、破壊的なアクションであるためです。ブラウザから自由にアクセスできると、さまざまな問題が発生する可能性があります。 GETリクエストは、サーバーの状態を変更してはなりません。これに関する詳細については、ここに素敵なウィキペディアの記事があります: http://en.wikipedia.org/wiki/REST#RESTful_web_services

43
Andrew Radev

上記の提案のいずれも私にはうまくいきませんでした....

この投稿は、他の選択肢を見つけるのに役立つ場合があります。 "/ users/sign_out"デバイスに一致するルートはありませんRails

Application.jsファイルに次の行を追加する必要がありました

//= require_tree .
// Add following lines.
//= require jquery 
//= require jquery_ujs
13
Vishal

これをapp/views/layouts /application.html.erbに入れます

<%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

お役に立てば幸いです

まったく同じ症状がありましたが、jquery-turbolinksとmasonry-Railsを使用して、サイトの遷移と位置を「適切に」画像化しています。

私はこれが遷移を「壊した」ことを発見しました:

//= require jquery_ujs

それでそれを削除し、トランジションは魅力のように機能しました...しかし、ログアウトしようとすると、レーキルートにパスの存在が示されていても、上記のエラーが発生しました。

私にとっての「修正」は、// = require Rails-ujsを追加し、ツリーをいくらか再配置することであることが判明したため、最終的に次のようになりました。

//= require Rails-ujs
//= require jquery
//= require jquery.turbolinks
//= require Twitter/bootstrap
//= require masonry/jquery.masonry
//= require masonry/jquery.imagesloaded.min
//= require masonry/modernizr-transitions
//= require turbolinks
//= require_tree .

余談ですが、石積みでの作業中にこのエラーを見つけた人は、操作したいリソースのIDを使用してdivに「transitions-enabledinfinite-scrollclearfix」を追加する必要があります...私の場合は「bookads」 「」

<div class="transitions-enabled" id="bookads">
  <% @books.each do |book| %>
    <div class="box panel panel-default">
      <div class="panel-heading index">
        <h3 class="panel-title text-center">
          <strong><%= book.title %></strong>
        </h3>
      </div>
     <div class="panel-body">... etc

私が使用した個々の要素のIDは「ボックス」と呼ばれていることに注意してください

あなたのコーヒースクリプトで:

$ ->
  $('#bookads').imagesLoaded ->
    $('#bookads').masonry
      itemSelector: '.box'
      isFitWidth: true
      isAnimated: true

また、「スムーズな」アニメーションを取得するために、上のツリーに示すように、masonry /jquery.imagesloaded.minとmasonry/modernizr-transitionsも追加しました。

うまくいけば、この答えが私が解決策を探すのに費やした数時間を誰かに節約するでしょう。

0
srattigan