0

我正在阅读 Michael Hartl 教程,但无法让注销工作正常进行。

我不是通过电子邮件识别,而是通过用户名工作。

注册和唱歌都可以正常工作,但我的退出导致错误:

ActiveRecord::RecordNotFound in UsersController#show

Couldn't find User with username = signout

app/controllers/users_controller.rb:9:in `show'

为什么它在显示方法中的 users_controller 中查找?为什么这么叫?应该是调用会话控制器的delete方法吧?

违规的第 9 行是:

  8  def show
  9     @user = User.find_by_username!(params[:username])
  10 end

我不明白参数在哪里传递(在哪里和什么地方),导致它认为“signout”== 用户名,而不是通过用户名查找和路由到session#destroy. 我该如何诊断?我可以在 Rails 控制台中输入什么来找出参数中当前包含的内容?

更新:

当我立即尝试时,我认为下面的解决方案有效,但问题刚刚从一条错误消息变为另一条错误消息。我已经按照建议移动了路线,但仍在继续

Request Parameters: {"username"=>"signout"}只是这次它位于我的

`Users#show model: users/show.html.erb where line #1 raised: 

undefined method username' for nil:NilClass 

Extracted source (around line #1): 

1: <\h2><%= @user.username %><\/h2> 
2: 
3: <!-- 
4:`

这是我的 routes.rb 文件的内容:

   match 'signup', to: 'users#new'
   match 'signin', to: 'sessions#new'
   match 'signout', to: 'sessions#destroy', via: 'delete'

   resources :sessions, only: [:new, :create, :destroy]

   match "/:username"  => "users#show", via: "get"
   resources :users
4

2 回答 2

3

我猜你有一条看起来像这样的路线:

get "/users/signout" => "sessions#destroy"

在此之前,您可能有一行如下所示:

get "/users/:username" => "users#show"

问题是路由到/users/signout将匹配/users/:username,并将您的请求发送到设置为的show操作。然后你打电话UsersControllerparams[:username]"signout"User.find_by_username!("signout")

您需要将您的/users/signout路线放在您的线路上方,/users/:username以便在路线之前匹配/users/:username请记住,Rails 在第一个可以匹配请求 URI的路由处停止尝试查找匹配的路由。您的更通用的通配符路线必须出现可能重叠的更具体的路线之后。


回复:你的更新

您的signout路由需要 HTTP DELETE 请求,该请求通过带有_method=delete参数的 POST 请求进行模拟。

为了匹配此路由,您需要使用表单或 abutton_to来发出 DELETE 请求:

button_to "Signout", signout_path, :method => :delete

销毁会话(在我看来)是一种特殊情况,您应该接受任何类型的 HTTP 请求。用户应该能够在他们的地址栏中输入/logout/signout输入,并通过 GET 请求销毁他们的会话。我强烈建议您删除via: :delete并使用以下内容:

match 'signout' => 'sessions#destroy'

相反,您对signupandsignin路由过于宽容,应该专门使用 GET 和 POST 请求,并路由到newandcreate操作而不是相同的操作。

get 'signup' => 'users#new'
post 'signin' => 'sessions#create'

我可以在 Rails 控制台中输入什么来找出参数中当前包含的内容?

没有什么。您无法params通过 Rails 控制台检查哈希,因为没有请求。您可以通过添加来检查您的日志文件logger.info(params.inspect),或者在浏览器中通过将其提升为错误消息来检查:raise params.inspect.

于 2012-07-17T19:46:40.920 回答
1

我也遇到了这个问题,meagar 提到的修复并没有为我解决。我的问题实际上源于 JavaScript 和DELETE链接中使用的方法。显然,如果没有 JavaScript 的帮助,浏览器实际上并不支持该DELETE请求。

要重现,只需关闭 JavaScript 并尝试使用使用此请求的链接,您会注意到它使用GET请求而不是指定的DELETE. 最终,我需要包含需要rails.js(或jquery-ujs在我的情况下)解决此问题的 application.js。

于 2013-01-28T20:12:16.567 回答