3

私の 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:

修繕!回答を提供してくれたすべての人に改めて感謝します。これを修正するために私がしたことは次のとおりです。

  1. コントローラーから @user 参照を削除しました (「表示」アクション)。以下でフレッドが述べたように、 @user 参照は不要であり、削除する必要がありました。これは、2 つの個別のオブジェクトを参照するために :id を 2 回使用していたためです。

  2. 「@work」変数を に編集しました@work = Work.find(params[:id])。これにより、どのユーザーが作成したかに関係なく、ID に基づいて正しい作業項目が検索されます。

  3. 作業ページにユーザー データを表示する必要がある場合は、単純<%= @work.user.name %>に show.html.erb ビュー ページで使用します。'@user = User.find(params[:id])' は必要ありません。'belongs_to :user' を使用して、works モデルに外部キー関係を既に定義しているためです。

助けてくれてありがとう!-j

4

4 に答える 4

4

show アクションで、@user をすべて削除して、次のように使用します。

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

これにより、誰でも任意の作品を閲覧できるようになります。

他のアクションについても同様です。言うことによって:

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

current_user のすべての作品から の作品を検索していますid == params[:id]

于 2013-03-29T16:51:28.840 に答える
1

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

同じ params[:id] を te id として使用して、ユーザーと作業の両方を検索できるためです。IDが同じならただの偶然です。

于 2013-03-28T22:59:27.183 に答える
1

current_user.works.find_by(id: params[:id]) を使用すると、何も見つからない場合に nil が返されることがわかりました。

これは、ルックアップで current_user を使用して少し安全にできるようになったため、少し良くなったと思います。ビューに依存してデータを表示しないようにする必要がないためです。

于 2016-08-05T21:25:49.313 に答える
0

ユーザーを削除しているようで、ぶら下がっている参照が残っていますworks

で作品を照会することにより

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

@user に属するすべての @user の作品を探している (冗長)

@work = @user.works@user.works が空の応答を返すため、代わりにこれらのぶら下がっている作品の参照を使用する場合は変更されません。

ただし、これは実際には最善の解決策ではありません。ユーザーが削除されたときの依存関係の破棄をより適切に処理する必要があります。

編集: 申し訳ありませんが、@user を使用する必要がある場所で current_user を使用しました。上記のコメントには同じエラーがあります。

于 2013-03-28T22:53:48.050 に答える