2017-05-08 150 views
0

這個問題一直在推動我幾天的堅果。這對我來說並不是什麼新鮮事,也沒有做任何多年的編程!redirect_to問題 - 軌道上的紅寶石

我寫了一個小應用程序,允許用戶使用facebook或github登錄,並且這部分工作正常。但是,當涉及註銷部分時,我收到一個錯誤 - 您正在查找的頁面不存在。

退出鏈接做到這一點: -

<li class="nav-item pull-right add-space"><%= link_to "Sign out", 'sign_out', method: :delete, class: 'nav-link' %></li> 

的routes.rb是: -

Rails.application.routes.draw do 
root 'home#index' 
get 'home/profile' 
get 'auth/:provider/callback', to: "sessions#create" 
delete 'sign_out', to: "sessions#destroy", as: 'sign_out' 
end 

而且會話控制器做到這一點: -

def destroy 
session[:user_id] = nil 
session[:omniauth] = nil 
redirect_to root_url, alert: "SIGNED OUT" 
end 

它是最後一行導致了我的問題,並且我嘗試了很多事情來讓它回到需要的地方。當我註銷瀏覽器地址欄中的url路徑爲'/ home/profile'時,出現錯誤時我看到的行爲是地址欄更改爲'home/sign_out'。在Heroku的日誌我,看到以下錯誤: -

ActionController::RoutingError (No route matches [DELETE] "/home/sign_out"): 

我已經試過這條線上各種不同的路由選項: -

redirect_to root_url, alert: "SIGNED OUT" 

,但沒有一個是成功的;我認爲重定向到路由URL可以在任何地方完成,並且是我需要的行爲,因爲用戶可以從應用程序中的任何位置註銷。

如果我不從應用程序的頂層登出(如https:///mysite.com/'它工作正常。

任何幫助嗎?

感謝

回答

0

改變如下代碼:

<li class="nav-item pull-right add-space"><%= link_to "Sign out", 'sign_out', method: :delete, class: 'nav-link' %></li> 

<li class="nav-item pull-right add-space"><%= link_to "Sign out", '/sign_out', method: :delete, class: 'nav-link' %></li> 
+0

@Dunny接受並投票我的答案,如果它適合你。謝謝 – puneet18

+0

我已經接受並投票了,謝謝。 – Dunny

+0

@Dunny你不接受我的答案。 – puneet18

0

嘗試改變這種

<li class="nav-item pull-right add-space"><%= link_to "Sign out", 'sign_out', method: :delete, class: 'nav-link' %></li> 

分成

<li class="nav-item pull-right add-space"><%= link_to "Sign out", sign_out_path, method: :delete, class: 'nav-link' %></li> 
  • link_to

    • 第一個參數:是鏈接 「文本」 頁面上顯示
    • 第二個參數:是呈現<a>鏈接

        href
      • 通常,您將在此使用一個變量,而不是一個String;你使用了一個字符串:'sign_out'
      • 然後呈現頁面

        <a href='sign_out'>Sign Out</a>

        • 上,這是相對於當前網頁。因此,如果您目前在/home,那麼鏈接將請求/home/sign_out;從而你得到這個錯誤。
        • 你應該使用sign_out_path,這是一個路由變量(即您在routes.rb`
        • 看到這一行定義? delete 'sign_out', to: "sessions#destroy", as: 'sign_out'
        • 只是一個_path_url追加到的as:的價值,在這種情況下,是'sign_out',這樣你會用你的路線變量是sign_out_path
0

嘗試以下

<li class="nav-item pull-right add-space"> 
    <%= link_to "Sign out", sign_out_path, method: :delete, class: 'nav-link' %> 
</li> 
0

行動destroysession_controllerdelete方法不執行。當你有什麼傳入鏈接從資源(數據庫),如DELETE /users/1

你的行動sign_out實際執行上get方法去除

Delete方法可以使用。因此,改變你的路線:

get '/destroy' => 'sessions#destroy' 

然後按鈕:

<%= link_to 'SIGN OUT', { action: 'destroy', controller: 'sessions' }, class: 'something' %> 

行動將符合爲其指定的路線,你不需要通過一個http方法