【问题标题】:ActiveRecord::RecordNotFound in UsersController#deactivate (Couldn't find User with 'id'=)在 UsersController#deactivate 中的 ActiveRecord::RecordNotFound(找不到具有 'id'= 的用户)
【发布时间】:2015-08-11 04:21:06
【问题描述】:

使用我的 rails 应用程序,我可以成功地销毁、注册和登录用户,但我似乎可以停用它们。我每次都会收到此错误: ActiveRecord::RecordNotFound in UsersController#deactivate (Couldn't find User with 'id'=)

record = s.execute([id], self, connection).first
    unless record
      raise RecordNotFound, "Couldn't find #{name} with '#{primary_key}'=#{id}"
    end
    record
  rescue RangeError

这是用户控制器:

def deactivate
 user = User.find(params[:user_id])
  if current_user.admin?
  user.deactivate_account!
  redirect_to users_path 
  else
   redirect_to :back
 end
end

_user.html.erb 视图:

<li><%= gravatar_for user, size: 50 %>
<%= link_to user.name, user %>
<% if current_user.admin? && !current_user?(user) %>
<%= link_to "delete", user, method: :delete,
                              data: { confirm: "You sure?" } %>
<% end %>

<% if current_user.admin? && @user != current_user %>
<%=link_to "deactivate", deactivate_path(user_id: @user), method: :post, 
                                         data: { confirm: "Are you sure?"}%> 
<% end %>
</li>

和路线:

get 'password_resets/new'
get 'password_resets/edit'
root             'static_pages#home'
get 'help'    => 'static_pages#help'
get 'about'   => 'static_pages#about'
get 'contact' => 'static_pages#contact'
get 'signup'  => 'users#new'
get    'login'   => 'sessions#new'
post   'login'   => 'sessions#create'
delete 'logout'  => 'sessions#destroy'
resources :users
resources :account_activations, only: [:edit]
resources :password_resets,     only: [:new, :create, :edit, :update]
post '/deactivate', to: "users#deactivate"

日志是:

Rendered .../.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates/rescues/_source.erb (9.0ms)
Rendered .../.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates/rescues/_trace.html.erb (3.9ms)
Rendered .../.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates/rescues/_request_and_response.html.erb (1.5ms)
Rendered .../.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates/rescues/_web_console.html.erb (1.3ms)
Rendered .../.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates/rescues/diagnostics.html.erb within rescues/layout (44.8ms)

可能出了什么问题?我假设错误在控制器中。我正在关注 Michael Hartl 教程,因为我是初学者,但我也在尝试自己实现(比如这个)。

【问题讨论】:

  • 能否请您发布您的日志的完整堆栈跟踪?
  • 我已经包含了日志。
  • 我的意思是堆栈跟踪。意思是,你看到错误的地方:ActiveRecord::RecordNotFound in UsersController#deactivate (Couldn't find User with 'id'=) 应该有一个查看完整堆栈跟踪的选项。我想看那个。应该有它失败的确切位置等的行号。
  • 啊,好吧..对不起:我把它们贴在这里了:pastie.org/10343107
  • 太好了,这会有所帮助。现在,能否请您发布您的UsersController 的完整代码?

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


【解决方案1】:

首先,您应该将此作为PUT 请求而不是POST,因为它正在更新用户记录。

以下是我为完成这项工作所做的更改:

在您的routes.rb 文件中修改了到PUT 的路由:

put 'deactivate/:id(.:format)', :to => 'users#deactivate', :as => :deactivate_user

您没有为您的用户模型实现 deactivate_account 方法。我这样做了。在您的用户模型中:

def deactivate_account
 update_attributes!(activated: false)
end

最后,像这样更改用户部分:

<%=link_to "Deactivate", deactivate_user_path(user), method: :put%>

【讨论】:

  • 现在:NoMethodError in UsersController#index undefined method 'id' for nil:NilClass
  • 嗯,这还不正确。您能否在不进行此更改的情况下发布完整的堆栈跟踪?
  • 请查看我更新的答案,如果现在可行,请告诉我。
  • 另外,你能把你的项目推送到 github,以便我可以在本地克隆并调试吗?
  • 我在 bitbucket 上有它:bitbucket.org/claucece/sample_app2。我在 githube 上也有它作为 privaterepo(但我不是所有者)。明天,我可以给你访问权限。
猜你喜欢
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 2017-03-18
  • 2019-08-01
相关资源
最近更新 更多