redirect_to问题 - 轨道上的红宝石

问题描述:

这个问题一直在推动我几天的坚果。这对我来说并不是什么新鲜事,也没有做任何多年的编程!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/'它工作正常。

任何帮助吗?

感谢

改变如下代码:

<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

尝试改变这种

<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

尝试以下

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

行动destroysession_controllerdelete方法不执行。当你有什么传入链接从资源(数据库),如DELETE /users/1

你的行动sign_out实际执行上get方法去除

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

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

然后按钮:

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

行动将符合为其指定的路线,你不需要通过一个http方法