Ruby on rails “没有路线匹配”/用户/注销;设计轨道3
我已在我的应用程序上安装了Desive,并在我的Ruby on rails “没有路线匹配”/用户/注销;设计轨道3,ruby-on-rails,ruby-on-rails-3,devise,routes,Ruby On Rails,Ruby On Rails 3,Devise,Routes,我已在我的应用程序上安装了Desive,并在我的application.html.erb文件中应用了以下内容: <div id="user_nav"> <% if user_signed_in? %> Signed in as <%= current_user.email %>. This cannot be cheese? <%= link_to 'Sign out', destroy_user_session_
application.html.erb
文件中应用了以下内容:
<div id="user_nav">
<% if user_signed_in? %>
Signed in as <%= current_user.email %>. This cannot be cheese?
<%= link_to 'Sign out', destroy_user_session_path %>
<% else %>
<%= link_to 'Register', new_user_registration_path %> or <%= link_to 'Sign in', new_user_session_path %>
<% end %>
</div>
你知道是什么导致了这个错误吗?我认为注销的方法是
DELETE
方法。这意味着您的注销链接需要如下所示:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
:删除%>
您的不包括
:method=>:delete
部分。另外,请注意,要使其起作用,您还必须在布局文件(application.html.erb
)中包含
。尝试添加新路由来设计/会话#销毁并链接到该路由。例如:
routes.rb
devise_for :users do
get 'logout' => 'devise/sessions#destroy'
end
视图:
您可能没有包含jquery\u ujs javascript文件。确保您使用的是最新版本的jquery ujs:和最后可用的文件:
rails generate jquery:install
您不应该有更多的rails.js文件。如果你这样做,你可能已经过时了。
还要确保该文件在config/application.rb中加载了默认值
config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)
(同样,这里不应该有rails.js文件)。
最后,添加上记录的链接(haml样式):
一切都会好起来的 除了一个例外,杰西的回答对我很有用:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
。。。致:
'delete'
因此,对我有效的代码是:
<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
”删除“%”
我在designe.rb中更改了这一行:
config.sign_out_via = :delete
到
它开始为我工作 使用github中的源代码查看它: (日期:2011年6月27日)
- #用于注销资源的默认HTTP方法。默认值是:get。 188
- #config.sign_out_via=:get 187
- #用于注销资源的默认HTTP方法。默认值为:删除。 188
- config.sign_out_via=:删除
<%= link_to('Sign out', destroy_user_session_path) %>
我在rails 3.1.0中遇到了同样的问题,我解决了在文件中添加以下行的问题:
app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs
这就是我所做的(使用Rails 3.0和Desive 1.4.2):
问题从rails 3.1开始。。。在
/app/assets/javascript/
中,只需查找application.js
如果文件不存在,请创建一个具有该名称的文件,我不知道为什么我的文件会消失或从未在“rails新应用程序”上创建过…
该文件是
jquery…
的实例,尽管它有点旧,但我还是想添加到该文件中
尽管有:method=>:delete,但“sign_out”链接仍然不起作用
表示必须包含
的注释提醒我最近添加了jqueryjava脚本,并使用简单的
标记来包含它们
当我将它们从:defaults之后移到before之后,注销再次开始工作
希望这对某人有所帮助。添加:
<%= csrf_meta_tag %> and
<%= javascript_include_tag :defaults %> to layouts
在路线中添加:
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
另一个选项是将注销配置为GET而不是DELETE,您可以在
/config/initializers/designe.rb
config.sign_out_via = :get
但正如史蒂夫·克拉布尼克在他的博客上写道的那样(http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html)由于此方法的语义,请尝试使用DELETE 如果您使用的是Rails 3.1,请确保您的application.html.erb注销看起来像:
:删除%>
您的javascript包含行如下所示
我猜有些gem会覆盖default.js位置的新结构。这意味着您在安装jquery rails gem之后还没有生成jquery文件。所以首先需要生成它
rails生成设备:安装
第一种选择:
这意味着您必须更改/config/initializers/designe.rb
config.sign_out_via = :get
config.sign_out_via=:删除到config.sign_out_via=:获取
第二种选择:
您只需将视图文件上的此行
更改为:delete%>
通常默认情况下不会写入
:method=>:delete
。在routes.rb文件中使用它:
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
查看您的routes.rb在“design_for:users”之前是否有“resource:users”,然后尝试交换它们:
- 为:用户设计
- 资源:用户
- 资源:用户
- 为:用户设计
devise_for :users do
get '/sign_out' => 'devise/sessions#destroy'
get '/log_in' => 'devise/sessions#new'
get '/log_out' => 'devise/sessions#destroy'
get '/sign_up' => 'devise/registrations#new'
get '/edit_profile' => 'devise/registrations#edit'
end
在application.html.erb中:
<%if user_signed_in?%>
<li><%= link_to "Sign_out", sign_out_path %></li>
<% end %>
使注销链接成为DELETE RESTful调用的能力需要一个html属性data method=“DELETE”
,使用rails code=link\u to('Logout',destroy\u user\u session\u path,:method=>:DELETE)
但是,如果您没有安装gemjquery ujs
,或者没有通过=javascript\u include\u标记“application”
在application.html中调用生成的javascript,则响应将作为GET请求发送,路由将失败
如果您不想使用jquery ujs
或找不到使其工作的方法,您有几个选项:
config.sign\u out\u更改为等于:在design.rb中获取
(不推荐,因为DELETE是适当的RESTful查询)
链接更改为到=按钮更改为('Logout',destroy\u user\u session\u path,:method=>:delete)
。使用按钮_to
Rails将在进行正确的删除调用时完成繁重的工作。然后,如果愿意,可以将按钮样式设置为链接
不要忘记在application.js(Rails 3)中包含以下行
将
jquery\u ujs
包含到我的rails应用程序中,它现在就可以工作了。这个问题已经有很多答案了。对我来说,问题有两个方面:
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
config.sign_out_via = :get
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
devise_for :users do
get '/sign_out' => 'devise/sessions#destroy'
get '/log_in' => 'devise/sessions#new'
get '/log_out' => 'devise/sessions#destroy'
get '/sign_up' => 'devise/registrations#new'
get '/edit_profile' => 'devise/registrations#edit'
end
<%if user_signed_in?%>
<li><%= link_to "Sign_out", sign_out_path %></li>
<% end %>
//= require_self
//= require jquery
//= require jquery_ujs
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
devise_scope :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
//= require jquery
//= require jquery_ujs
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>
config.sign_out_via = :delete ( or :get which u like to use.)
<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>
<%= javascript_include_tag "myDirectiveJSfile" %>
//= require jquery
//= require jquery_ujs
<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
devise_scope :user do
match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end
devise_for :users
devise_scope :user do
get '/users/sign_out' => 'devise/sessions#destroy'
end
gem 'jquery-rails'
gem 'turbolinks'
gem 'jquery-turbolinks'
//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
//= require_tree .
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag :defaults %>
<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>