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>
答
尝试改变这种
<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>
链接-
的
- 通常,您将在此使用一个变量,而不是一个
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
- 上,这是相对于当前网页。因此,如果您目前在
href
值 - 通常,您将在此使用一个变量,而不是一个
答
尝试以下
<li class="nav-item pull-right add-space">
<%= link_to "Sign out", sign_out_path, method: :delete, class: 'nav-link' %>
</li>
答
行动destroy
在session_controller
上delete
方法不执行。当你有什么传入链接从资源(数据库),如DELETE /users/1
你的行动sign_out
实际执行上get
方法去除
Delete
方法可以使用。因此,改变你的路线:
get '/destroy' => 'sessions#destroy'
然后按钮:
<%= link_to 'SIGN OUT', { action: 'destroy', controller: 'sessions' }, class: 'something' %>
行动将符合为其指定的路线,你不需要通过一个http
方法
@Dunny接受并投票我的答案,如果它适合你。谢谢 – puneet18
我已经接受并投票了,谢谢。 – Dunny
@Dunny你不接受我的答案。 – puneet18