0

has_manyの投稿があるトピックがあります。各投稿はユーザーに属し、各ユーザーはhas_oneプロファイルを持っています。

特定のトピックの「表示」ページで、投稿を作成したユーザーのプロファイル情報を表示しようとしています。

<% @topic.posts.each do |post| %>

<%= post.user.profile.first_name %>

<% end %>

次のエラーが発生します。

nil:NilClassの未定義のメソッド `profile'

プロファイルにアクセスできない理由はありますか?お知らせ下さい。

私のトピックコントローラーは次のとおりです。

class TopicsController < ApplicationController
  # GET /topics
  # GET /topics.json
  add_breadcrumb :index, :topics_path

  def index
    if params[:tag]
        @topics = Topic.tagged_with(params[:tag])
    else
        @topics = Topic.all
    end

    @newtopic = Topic.new


    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @topics }
    end
  end

  # GET /topics/1
  # GET /topics/1.json
  def show
    @topic = Topic.find(params[:id])
    @posts = @topic.posts
    @newpost = @topic.posts.build
    add_breadcrumb @topic.name

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @topic }
    end
  end

  # GET /topics/new
  # GET /topics/new.json
  def new
    add_breadcrumb :new, :topics_path
    @topic = Topic.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @topic }
    end
  end

  # GET /topics/1/edit
  def edit
    @topic = Topic.find(params[:id])
  end

  # POST /topics
  # POST /topics.json
  def create
    @topic = Topic.new(params[:topic])

    @topic.user_id = current_user.id
    @topic.last_poster_id = current_user.id
    @topic.last_post_at = Time.now


    respond_to do |format|
      if @topic.save
        format.html { redirect_to @topic, notice: 'Topic was successfully created.' }
        format.json { render json: @topic, status: :created, location: @topic }
      else
        format.html { render action: "new" }
        format.json { render json: @topic.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /topics/1
  # PUT /topics/1.json
  def update
    @topic = Topic.find(params[:id])

    respond_to do |format|
      if @topic.update_attributes(params[:topic])
        format.html { redirect_to @topic, notice: 'Topic was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @topic.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /topics/1
  # DELETE /topics/1.json
  def destroy
    @topic = Topic.find(params[:id])
    @topic.destroy

    respond_to do |format|
      format.html { redirect_to topics_url }
      format.json { head :no_content }
    end
  end
end
4

2 に答える 2

1

@topic.posts.buildあなたのエラーは、 show アクションのこの行と view のこの行によって引き起こされます@topic.posts.each。コントローラーで新しい投稿を@topic.posts作成しているため、ユーザーが nil である可能性が最も高い新しいレコードが含まれます。したがって、問題の解決策は、ビュー@postsの代わりに使用する@topic.postsことです。

于 2013-02-12T00:41:33.360 に答える
1

データベースを確認してください。データベースに、どのユーザーにも対応しない投稿がある可能性が非常に高いです。その投稿のユーザーは none であるため、nil:NilClassuser(null) のプロファイルは未定義になります。

これは主に、ユーザーに属する投稿を作成した後、その投稿に属するユーザーをデータベースから削除した場合に発生します。

正しい方法は、ユーザー モデルに次のような制約を課すことです。

class Post
 belongs_to :user, :dependent => :destroy
end

したがって、ユーザーが削除されると、そのユーザーの対応する投稿も削除されます。

テーブルを使用してレコード間の関係を強制した後、データベースからレコードを直接削除することはお勧めできません。

于 2013-02-11T08:10:17.587 に答える