找不到 id= 的用户 (ActiveRecord::RecordNotFound) [英] Couldn't find User with id= (ActiveRecord::RecordNotFound)

查看:53
本文介绍了找不到 id= 的用户 (ActiveRecord::RecordNotFound)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用我的 rails 应用程序,我可以成功创建一个对象(称为工作;将它们视为博客文章)作为 current_user.用户 has_many 工作.我可以通过使用我的 postgresql 浏览器检查数据库来验证对象是否已成功创建.该表还包含创建工作的正确 user_id,因此我知道我的创建函数在我的控制器中工作.

With my rails app I can successfully create an object (called work; think of them as blog posts) as current_user. A user has_many works. I can validate that the object is created successfully by checking the database using my postgresql browser. The table also holds the correct user_id that created the work so I know that my create function works in my controller.

但是,问题是当我尝试查看作品时,出现以下错误:

However, the problem is that when I try to view the work, I get the following error:

ActiveRecord::RecordNotFound in WorksController#show

ActiveRecord::RecordNotFound in WorksController#show

找不到 id=23 的用户

Couldn't find User with id=23

app/controllers/works_controller.rb:43:in `show'

app/controllers/works_controller.rb:43:in `show'

奇怪的是,我仍然可以查看几周前创作的作品.错误只出现在我最近创作的作品中.

What's odd is that I can still view works that I created several weeks ago. The error only appears for works that I have created recently.

这是 Works 控制器:

Here's the Works controller:

class WorksController < ApplicationController
   #before_filter :current_user,   only: [:edit, :update]

  def index
    @works = Work.all

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @works }
end
end
def create
    @work = current_user.works.create(params[:work])
    redirect_to current_user
  end

def edit
    @work = current_user.works.find(params[:id])
end

def new
  @work = current_user.works.new
end

def destroy
  @work = current_user.works.find(params[:id]).destroy
  flash[:success] = "Work deleted"
  redirect_to current_user
end

 def update
    @work = current_user.works.find(params[:id])
    if @work.update_attributes(params[:work])
      flash[:success] = "updated"
      redirect_to @work
    else
      render 'edit'
    end
  end


  def show
    @user = User.find(params[:id])
    @work = @user.works.find(params[:id])
    @activities = PublicActivity::Activity.order("created_at DESC").where(trackable_type: "Work", trackable_id: @work).all

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @work }
    end
  end
end

我假设错误出在 Works 控制器中.我需要在控制器中编辑什么才能修复显示"错误?

I'm assuming the error is in the Works controller. What do I need to edit in the controller in order to fix the "show" errors?

如果我使用上面的当前代码,我只能查看其他人的作品(查看我自己的会引发错误).但是,如果我将 current_user 添加到查询中(例如@works= current_user.works),那么我只能看到我自己的作品.查看其他人的作品会引发错误.如何解决此问题,以便我可以查看自己的作品和他人创作的作品?

If I use the current code above, I can only view other people's works (viewing my own throws an error). However, if I add current_user into the query (such as @works= current_user.works), I can then only see my own works. Viewing other people's works throws an error. How can I fix this so that I can view both my own works and works created by others?

编辑 2:

@work = Work.find(params[:id]) 如果我从控制器中删除@user 和works show.html 视图文件中的@user"引用,则工作.但是,我需要控制器中的@user"引用,因为我想显示创建作品的用户的名称.我该怎么做呢?

@work = Work.find(params[:id]) works if I remove @user from the controller and the "@user" references in the works show.html view file. However, I need the "@user" reference in the controller because I want to display the name of the user that created the work. How should I go about doing this?

编辑 3:

已修复!再次感谢所有提供答案的人!这是我为修复它所做的:

  1. 我从控制器中删除了@user 引用(show"操作).正如 Fred 在下面提到的,@user 引用是不需要的,需要删除,因为我使用 :id 两次来引用两个单独的对象.

  1. I removed the @user reference from the controller ("show" action). As Fred mentioned below the @user reference is not needed and needed to be removed since I was using :id twice to reference two separate objects.

将@work"变量编辑为@work = Work.find(params[:id]).这将根据 id 查找正确的工作项,而不管它是由哪个用户创建的.

Edited the "@work" variable to @work = Work.find(params[:id]). This will look for the correct work item based on the id regardless of which user created it.

当我需要在工作页面上显示用户数据时,只需在 show.html.erb 视图页面上使用 <%= @work.user.name %>.不需要'@user = User.find(params[:id])',因为我已经使用'belongs_to :user'在作品模型上定义了外键关系.

When I need to display the user data on the work pages, simply use <%= @work.user.name %> on the show.html.erb view page. '@user = User.find(params[:id])' is not needed since I already defined a foreign key relationship on the works model by using 'belongs_to :user'.

再次感谢大家的帮助!-j

Thanks again for all of the help! -j

推荐答案

在你的show action中,把@user一起去掉,直接使用:

In your show action, get rid of @user all together and just use:

@work = Work.find(params[:id])

这将允许任何人查看任何作品.

This will allow anyone to view any work.

您的其他操作也是如此.说:

Same goes for your other actions. By saying:

@work = current_user.works.find(params[:id])

您正在搜索 current_user 的所有作品以寻找具有 id == params[:id] 的作品.

you are searching through all the current_user's works for a work with id == params[:id].

这篇关于找不到 id= 的用户 (ActiveRecord::RecordNotFound)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆