私の Rails アプリでは、オブジェクト (work と呼ばれます。ブログ投稿と考えてください) を current_user として正常に作成できます。ユーザー has_many が動作します。postgresql ブラウザーを使用してデータベースをチェックすることで、オブジェクトが正常に作成されたことを検証できます。テーブルには、作業を作成した正しい user_id も保持されているため、作成関数がコントローラーで機能することがわかります。
ただし、問題は、作品を表示しようとすると、次のエラーが発生することです。
ActiveRecord::WorksController の RecordNotFound#show
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コントローラーにあると思います。「表示」エラーを修正するには、コントローラーで何を編集する必要がありますか?
編集: 上記の現在のコードを使用すると、他の人の作品しか表示できません (自分の作品を表示するとエラーがスローされます)。しかし、@works= current_user.works などのクエリに current_user を追加すると、自分の作品しか表示されなくなります。他の人の作品を見るとエラーになります。自分の作品と他の人が作成した作品の両方を表示できるようにするにはどうすればよいですか?
編集2:
@work = Work.find(params[:id]) は、コントローラーから @user を削除し、works show.html ビュー ファイルの「@user」参照を削除すると機能します。ただし、作品を作成したユーザー名を表示したいので、コントローラーに「@user」の参照が必要です。これを行うにはどうすればよいですか?
編集3:
修繕!回答を提供してくれたすべての人に改めて感謝します。これを修正するために私がしたことは次のとおりです。
コントローラーから @user 参照を削除しました (「表示」アクション)。以下でフレッドが述べたように、 @user 参照は不要であり、削除する必要がありました。これは、2 つの個別のオブジェクトを参照するために :id を 2 回使用していたためです。
「@work」変数を に編集しました
@work = Work.find(params[:id])
。これにより、どのユーザーが作成したかに関係なく、ID に基づいて正しい作業項目が検索されます。作業ページにユーザー データを表示する必要がある場合は、単純
<%= @work.user.name %>
に show.html.erb ビュー ページで使用します。'@user = User.find(params[:id])' は必要ありません。'belongs_to :user' を使用して、works モデルに外部キー関係を既に定義しているためです。
助けてくれてありがとう!-j