2014-10-28 4 views
-1

Я знаю, что это легко, но я не могу заставить его работать. Я создаю сайт, на котором пользователи могут создавать сообщения. Я хочу показать эти сообщения вместе с именем пользователя, которое содержится в таблице пользователя. Я не могу это показать! Я получаю эту ошибку:Rails 4 Отображение данных из нескольких таблиц

undefined method `name' for nil:NilClass 

Вот мой код:

Модели:

class User < ActiveRecord::Base 
    has_many :posts\ 

class Post < ActiveRecord::Base 
    belongs_to :user 

Контроллеры:

class PostsController < ApplicationController 
    def index 
    @posts = Post.includes(:user).all.sort_by &:created_at 
    @posts.reverse! 
    end 

class UsersController < ApplicationController 
    def index 
    @users = User.all.order(:name) 
    end 

Вид:

<% @posts.each do |post| %> 
    <%= post.user.name %><BR><BR> 
    <%= post.post_content %><BR><BR> 
<% end %> 
+1

Что вы получаете, когда делаете 'Post.includes (: user) .all.sort_by (&: created_at) .first' и' Post.includes (: user) .all.sort_by (&: created_at) .first .user.name' в консоли rails? – nikkon226

+1

Если ваши объекты действительно связаны, вам не нужно будет включать пользователя. 'Post.first.user' должен возвращать объект пользователя. Похоже, что он возвращает нуль для вас, поэтому ваша связь не была сохранена. – jeremywoertink

+1

Возможно, это связано с тем, что в вашем db есть запись, которая не была назначена ни одному пользователю. запустите этот запрос в 'rails console', чтобы узнать, есть ли они:' Post.where (user_id: nil) ' – Alireza

ответ

1

Кажется, что в вашем приложении можно добавить сообщение без пользователя. Поэтому вы можете заменить его post.user.try!(:name).

P.S. Лучше использовать .order(:created_at) вместо sort_by(&:created_at).

+1

Пропустил это. Вы можете использовать '.order (created_at:: desc)', а также удалить '.reverse!'. – prcu

+0

Я только что проверил. все мои сообщения связаны с пользователями, и у всех моих пользователей есть имена. – MandyM

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