设计轨道3.1.3没有路径匹配[DELETE]“/ users / sign_out”

时间:2011-12-30 03:36:23

标签: ruby-on-rails ruby-on-rails-3 devise

我在使用设计1.1.9和使用注销链接的rails 3.1.3时遇到了问题。

<%= link_to 'sign out', destroy_user_session_path, :method => :delete %>

经过一段时间的研究后,我唯一的答案就是人们错过了:method =&gt; :在退出链接中删除,因为您可以看到我的链接中有该方法。我也试过

<%= link_to('sign out', destroy_user_session_path, :method => :delete) %>

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 GET    /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"}
 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"}
  article_comments GET    /articles/:article_id/comments(.:format)          {:action=>"index", :controller=>"comments"}
                   POST   /articles/:article_id/comments(.:format)          {:action=>"create", :controller=>"comments"}
   new_article_comment GET    /articles/:article_id/comments/new(.:format)      {:action=>"new", :controller=>"comments"}
  edit_article_comment GET    /articles/:article_id/comments/:id/edit(.:format) {:action=>"edit", :controller=>"comments"}
   article_comment GET    /articles/:article_id/comments/:id(.:format)      {:action=>"show", :controller=>"comments"}
                   PUT    /articles/:article_id/comments/:id(.:format)      {:action=>"update", :controller=>"comments"}
                   DELETE /articles/:article_id/comments/:id(.:format)      {:action=>"destroy", :controller=>"comments"}
          articles GET    /articles(.:format)                               {:action=>"index", :controller=>"articles"}
                   POST   /articles(.:format)                               {:action=>"create", :controller=>"articles"}
       new_article GET    /articles/new(.:format)                           {:action=>"new", :controller=>"articles"}
      edit_article GET    /articles/:id/edit(.:format)                      {:action=>"edit", :controller=>"articles"}
           article GET    /articles/:id(.:format)                           {:action=>"show", :controller=>"articles"}
                   PUT    /articles/:id(.:format)                           {:action=>"update", :controller=>"articles"}
                   DELETE /articles/:id(.:format)                           {:action=>"destroy", :controller=>"articles"}
              root        /                                                 {:action=>"index", :controller=>"articles"}

非常感谢任何帮助

更新

以下答案建议改变     config.sign_out_via =:get to:delete但我在以下devise.rb文件中没有该行

# Use this hook to configure devise mailer, warden hooks and so forth. The first
# four configuration values can also be set straight in your models.
Devise.setup do |config|
# ==> Mailer Configuration
# Configure the e-mail address which will be shown in DeviseMailer.
config.mailer_sender = "please-change-me@config-initializers-devise.com"

# Configure the class responsible to send e-mails.
# config.mailer = "Devise::Mailer"

# ==> ORM configuration
# Load and configure the ORM. Supports :active_record (default) and
# :mongoid (bson_ext recommended) by default. Other ORMs may be
# available as additional gems.
require 'devise/orm/active_record'

# ==> Configuration for any authentication mechanism
# Configure which keys are used when authenticating an user. By default is
# just :email. You can configure it to use [:username, :subdomain], so for
# authenticating an user, both parameters are required. Remember that those
# parameters are used only when authenticating and not when retrieving from
# session. If you need permissions, you should implement that in a before filter.
 config.authentication_keys = [ :email ]

# Tell if authentication through request.params is enabled. True by default.
 config.params_authenticatable = true

# Tell if authentication through HTTP Basic Auth is enabled. False by default.
# config.http_authenticatable = false

# Set this to true to use Basic Auth for AJAX requests.  True by default.
# config.http_authenticatable_on_xhr = true

# The realm used in Http Basic Authentication
# config.http_authentication_realm = "Application"

# ==> Configuration for :database_authenticatable
# For bcrypt, this is the cost for hashing the password and defaults to 10. If
# using other encryptors, it sets how many times you want the password re-encrypted.
config.stretches = 10

# Define which will be the encryption algorithm. Devise also supports encryptors
# from others authentication tools as :clearance_sha1, :authlogic_sha512 (then
# you should set stretches above to 20 for default behavior) and :restful_authentication_sha1
# (then you should set stretches to 10, and copy REST_AUTH_SITE_KEY to pepper)
config.encryptor = :bcrypt

# Setup a pepper to generate the encrypted password.
config.pepper =   "hidden"

# ==> Configuration for :confirmable
# The time you want to give your user to confirm his account. During this time
# he will be able to access your application without confirming. Default is nil.
# When confirm_within is zero, the user won't be able to sign in without confirming. 
# You can use this to let your user access some features of your application 
# without confirming the account, but blocking it after a certain period 
# (ie 2 days). 
# config.confirm_within = 2.days

# ==> Configuration for :rememberable
# The time the user will be remembered without asking for credentials again.
# config.remember_for = 2.weeks

# If true, a valid remember token can be re-used between multiple browsers.
# config.remember_across_browsers = true

# If true, extends the user's remember period when remembered via cookie.
# config.extend_remember_period = false

# ==> Configuration for :validatable
# Range for password length
 config.password_length = 6..20

# Regex to use to validate the email address
 config.email_regexp = /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i

# ==> Configuration for :timeoutable
# The time you want to timeout the user session without activity. After this
# time the user will be asked for credentials again.
# config.timeout_in = 10.minutes

# ==> Configuration for :lockable
# Defines which strategy will be used to lock an account.
# :failed_attempts = Locks an account after a number of failed attempts to sign in.
# :none            = No lock strategy. You should handle locking by yourself.
# config.lock_strategy = :failed_attempts

# Defines which strategy will be used to unlock an account.
# :email = Sends an unlock link to the user email
# :time  = Re-enables login after a certain amount of time (see :unlock_in below)
# :both  = Enables both strategies
# :none  = No unlock strategy. You should handle unlocking by yourself.
# config.unlock_strategy = :both

# Number of authentication tries before locking an account if lock_strategy
# is failed attempts.
# config.maximum_attempts = 20

# Time interval to unlock the account if :time is enabled as unlock_strategy.
# config.unlock_in = 1.hour

# ==> Configuration for :token_authenticatable
# Defines name of the authentication token params key
# config.token_authentication_key = :auth_token

# ==> Scopes configuration
# Turn scoped views on. Before rendering "sessions/new", it will first check for
# "users/sessions/new". It's turned off by default because it's slower if you
# are using only default views.
 config.scoped_views = true

# Configure the default scope given to Warden. By default it's the first
# devise role declared in your routes.
# config.default_scope = :user

# Configure sign_out behavior. 
# By default sign_out is scoped (i.e. /users/sign_out affects only :user scope).
# In case of sign_out_all_scopes set to true any logout action will sign out all active scopes.
 config.sign_out_all_scopes = true

# ==> Navigation configuration
# Lists the formats that should be treated as navigational. Formats like
# :html, should redirect to the sign in page when the user does not have
# access, but formats like :xml or :json, should return 401.
# If you have any extra navigational formats, like :iphone or :mobile, you
# should add them to the navigational formats lists. Default is [:html]
# config.navigational_formats = [:html, :iphone]


# ==> Warden configuration
# If you want to use other strategies, that are not (yet) supported by Devise,
# you can configure them inside the config.warden block. The example below
# allows you to setup OAuth, using http://github.com/roman/warden_oauth
#
# config.warden do |manager|
#   manager.oauth(:twitter) do |twitter|
#     twitter.consumer_secret = <YOUR CONSUMER SECRET>
#     twitter.consumer_key  = <YOUR CONSUMER KEY>
#     twitter.options :site => 'http://twitter.com'
#   end
#   manager.default_strategies(:scope => :user).unshift :twitter_oauth
# end
end

并添加行

config.sign_out_via = :get

使服务器无法启动 再次感谢

3 个答案:

答案 0 :(得分:3)

路由输出中的users/sign_out路由有一个GET请求,而不是DELETE。

我怀疑你的config/initializers/devise.rb

中有类似的内容
config.sign_out_via = :get

默认情况下,此选项设置为:delete

答案 1 :(得分:0)

出于多种原因,您不应在devise.rb文件中更改config.sign_out_via =:get to:delete。

1)这会将删除操作更改为Get而不是Delete for 2

2)您在此处撰写的每个测试都将反映为具有Get请求的删除。这意味着行动的结果是不正确的。

3)你拥有的代码是正确的,这正是我所拥有的。

  

作为一名初学者,让我来看看我认为的问题。当我遇到这个错误时,我确认:“你确定吗?”在erb的最后。我改变了erb标签内部的位置并且工作正常。我认为这可能与路由没有注册方法:: delete。

答案 2 :(得分:0)

> rails generate devise:views
  • 我的设计使用此生成器的视图文件夹:http://j.mp/1cr6j6s
  • 使用devise_for :users
  • 在routes.rb上路由