找不到 id= 的用户 (ActiveRecord::RecordNotFound) [英] Couldn't find User with 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:
已修复!再次感谢所有提供答案的人!这是我为修复它所做的:
我从控制器中删除了@user 引用(show"操作).正如 Fred 在下面提到的,@user 引用是不需要的,需要删除,因为我使用 :id 两次来引用两个单独的对象.
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屋!