找不到ID为(= ActiveRecord :: RecordNotFound)的用户

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

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

WorksController#show中的ActiveRecord :: RecordNotFound

找不到ID = 23的用户

app / controllers / works_controller.rb:43:在’show’中

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

这是Works控制器:

class WorksController  @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引用(“show”操作)。 正如Fred在下面提到的那样,不需要@user引用,因为我使用了:id两次来引用两个独立的对象。

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

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

再次感谢所有的帮助! -j

在你的show动作中,一起摆脱@user并使用:

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

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

你的其他行动也是如此。 说:

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

您正在搜索所有current_user的作品,以查找id == params[:id]

我怀疑你在查找用户时使用的是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 

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

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

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

看起来你正在删除一个用户,并留下了对works的悬空引用

通过查询作品

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

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

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

这实际上不是最好的解决方案,您需要在删除用户时更好地处理依赖项的破坏。

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