2013-02-11 8 views
0

У меня есть Тема, в которой есть сообщения__очень. Каждое сообщение принадлежит Пользователю, и каждый Пользователь имеет профиль.Как получить доступ к связанной модели связанной модели?

На моей странице «шоу» для конкретной темы, я стараюсь, чтобы отобразить информацию о профиле пользователя, который создал этот пост:

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

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

<% end %> 

Я получаю следующее сообщение об ошибке:

undefined method `profile' for nil:NilClass

Любых идея, почему это не позволяет мне получить доступ к профилю? Пожалуйста, порекомендуйте.

Мой контроллер Тема заключается в следующем:

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 
+2

у вас есть сообщение, в котором пользователь равен нулю, что вызывает ошибку. – jvnill

+0

Спасибо за ваш ответ. Я проверил и нет сообщения без user_id. Любая другая идея о том, что может быть неправильным? –

ответ

1

Ваша ошибка вызвана этой линией в действии show @topic.posts.build, и эта линия на вид @topic.posts.each. Поскольку вы создаете новую запись в контроллере, @topic.posts включает в себя новую запись, которая, скорее всего, имеет пользователя как нуль. Итак, решение вашей проблемы - использовать @posts вместо @topic.posts.

+0

Спасибо, что решили проблему! –

1

Проверьте вашу базу данных. Очень вероятно, что в вашей базе данных есть сообщение, которое не соответствует ни одному пользователю. Поскольку пользователь для этого сообщения не имеет значения, профиль становится неопределенным для nil:NilClass, который является пользователем (null).

Это происходит, главным образом, при создании сообщения, которое принадлежит пользователю, но затем вы удаляете пользователя, принадлежащего этому сообщению из базы данных.

Правильный путь наложить ограничение в модели пользователя, которая должна быть-

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

Таким образом, если пользователь будет удален, соответствующие сообщения этого пользователя также удаляются.

Обратите внимание: это не является хорошей практикой для прямого удаления записей из базы данных после установления отношений между ними с использованием таблиц.

+0

Благодарим вас за комментарий. Я обновил отношения так, что есть: depend =>: destroy. Но я также проверил все записи, и нет сообщения, у которого нет действительного идентификатора пользователя. Любая другая идея о том, что это может быть? Спасибо –

Смежные вопросы