【问题标题】:Couldn't find User with id= (ActiveRecord::RecordNotFound)找不到 id= 的用户 (ActiveRecord::RecordNotFound)
【发布时间】:2016-08-06 05:25:49
【问题描述】:

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

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

WorksController#show 中的 ActiveRecord::RecordNotFound

找不到 id=23 的用户

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

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

这是 Works 控制器:

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 控制器中。为了修复“显示”错误,我需要在控制器中编辑什么?

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

编辑 2:

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

编辑 3:

已修复!再次感谢所有贡献答案的人!以下是我修复它的方法:

  1. 我从控制器中删除了@user 引用(“显示”操作)。正如 Fred 在下面提到的,不需要 @user 引用并且需要将其删除,因为我使用 :id 两次来引用两个单独的对象。

  2. 将“@work”变量编辑为@work = Work.find(params[:id])。无论是哪个用户创建的,这都会根据 id 查找正确的工作项。

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

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

【问题讨论】:

  • 你为什么用@user.works with a find()查询你应该只需要使用@work = current_user.works
  • 对,id不能兼任用户的记录id和要展示的作品的记录id。如果您知道作品的 id,只需按 id 查找该记录(Work.find(params[:id]),如答案 2)。如果您在提出演出请求时不知道 Work id,则需要重新考虑如何获取它。

标签: ruby-on-rails


【解决方案1】:

在你的表演动作中,把@user 全部去掉,只使用:

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

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

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

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

您正在所有 current_user 的作品中搜索id == params[:id] 的作品。

【讨论】:

  • 您好,谢谢您的回复。如果我从控制器中删除 @user 并在作品 show.html 视图文件中删除“@user”引用,这将起作用。但是,我需要控制器中的“@user”引用,因为我想显示创建该作品的用户的名称。我该怎么做呢?非常感谢您迄今为止的帮助!
  • 想通了!我只需要 !再次感谢您的回答!
【解决方案2】:

我怀疑您在查找用户时使用的是work_id 而不是user_id,因此它有时可以工作,但 ID 错误。

您在工作控制器中。 params[:id] 是工作。

所以这个:

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

应该是这样的:

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

如果你只想让所有作品都使用

@works = Work.all

因为您可以使用与 te id 相同的 params[:id] 来查找用户和工作。如果他们是同一个ID,那只是巧合。

【讨论】:

  • 嗨迈克尔,感谢您的回复!我更改了代码,但现在我得到了这个错误:找不到没有 ID 的用户。我越来越近了吗?
  • 当我以一个用户身份登录并尝试查看其他人所做的工作时,这不起作用。当我想查看自己创建的作品时,此代码有效,但当我查看其他人的作品时出现错误:无法找到 ID=1 的作品 [WHERE "works"."user_id" = 3]
  • 如何确定其他用户的id?
  • 在命令行运行 rails 控制台 (script/rails console) 然后执行 User.all
  • 或者只是rails c 然后User.all 使用当前版本的rails
【解决方案3】:

我发现使用 current_user.works.find_by(id: params[:id]) 可以在找不到任何内容时返回 nil。

我认为这会更好一些,因为您现在可以在查找中使用 current_user 以更安全一些,因为您不必依赖视图来不显示它不应该显示的数据,因为它永远不会得到它。

【讨论】:

    【解决方案4】:

    您似乎正在删除一个用户,并留下了对 works 的悬空引用

    通过查询作品

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

    您正在寻找属于@user 的所有@user 作品(冗余)

    如果您改用@work = @user.works,则不会触及那些悬空的作品引用,因为@user.works 将返回一个空响应。

    但这确实不是最好的解决方案,您需要更好地处理删除用户时的依赖关系的破坏。

    编辑:对不起,我在应该使用@user 的地方使用了 current_user,上面的评论有同样的错误。

    【讨论】:

    • 嗨,伊桑,感谢您的回复!问题是我没有删除任何用户。我刚刚尝试了您的查询,创建了一个新作品,尝试访问它,但我仍然遇到同样的错误。我没有使用 current_user.works.find,因为我希望每个人都能看到工作对象,无论是谁制作的。例如,我希望每个人都能够查看 appURL/works/24 。我在 Users 控制器上使用 current_user.works 来列出该用户的所有作品。
    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多