-1

У меня есть три модели: модель пользователя, модель Post и модель комментариев. Пользователь может создать сообщение, а затем на странице показа публикации, есть список комментариев с формой для публикации комментария. Комментарий публикуется и отображается на странице показа сообщений. Я решил вставить комментарии внутри сообщений и оставить пользователей в покое. Вот мой routes.rb и каждый из моих моделейСтранная ошибка с ассоциацией belongs_to между комментарием и пользователем

resources :users, except: [:index] 

ресурсов: должности, за исключением: [: индекс,: редактировать,: обновление] сделать ресурсы: комментарии только: [: создание,: уничтожить] конец

class User < ActiveRecord::Base 
has_many :posts, dependent: :destroy 
has_many :comments, foreign_key: "author_id" 

class Post < ActiveRecord::Base 
belongs_to :user 
has_many :comments, dependent: :destroy 

class Comment < ActiveRecord::Base 
belongs_to :post 
belongs_to :author, class_name: "User" 

Моя проблема связана с ассоциацией между пользователем и комментарием (я считаю). На мой пост/шоу зрения, у меня есть следующий код:

<% if @comments.any? %> 
       <% @comments.each do |comment| %> 
        <p><%= comment.author_id %>: <%= comment.content %></p> 
       <% end %> 
      <% end %> 

Этот код работает, например, он печатает следующий за комментарием (при условии, что пользователь, создавший это имеет идентификатор 15)

15 : это комментарий

Таким образом, для меня ясно, что он подбирает, кто его автор. НО ВОТ ВОПРОС: Когда я пытаюсь напечатать следующее:

<p><%= comment.author.full_name %>: <%= comment.content %></p> 

Это дает мне это «Действие контроллера: Пойманное» ошибка:

«неопределенный метод` имя пользователя»для ноль: NilClass»

Не должно ли ассоциация подбирать для меня свойство full_name автора (пользователя)? Я знаю, что у меня что-то отсутствует, ЛЮБАЯ помощь очень ценится. Я также буду включать контроллер сообщений и контроллер комментариев прямо ниже. Мои сообщения контроллера показать действие:

def show 
    @post = Post.find(params[:id]) 
    @comment = @post.comments.build 
    @comments = @post.comments 
end 

А вот мой комментарий контроллер создает действия следует моему сильному Params:

def create 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.build(comments_params) 
    if @comment.save 
     flash[:good] = "Your comment has been posted!" 
     redirect_to @post 
    else 
     flash[:bad] = "Sorry, your comment failed to post." 
     redirect_to @post 
    end 
end 

def comments_params 
     params.require(:comment).permit(:content, :author_id) 
    end 
+0

Кто-нибудь, пожалуйста, помогите мне! – Parker

+0

Я думаю, вам нужно настроить внешний ключ, прежде чем вы сможете вызвать <% = comment.author.full_name%>, этот проект загружен в github? – mrvncaragay

+0

У меня его нет на github, нет ... Где я должен установить внешний ключ? Я установил его в моей модели User, где я написал has_many: comments, foreign_key: «author_id» – Parker

ответ

1

Ошибка предполагает у вас есть проблемы с ассоциацией.


Быстрое исправление было бы использовать try:

<%= comment.author.try(:full_name) %> 

Это эквивалент ... <%= comment.author.full_name if comment.author %>

-

Я лично использую следующие:

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :comments, foreign_key: :author_id 
end 

#app/models/comment.rb 
class Comment < ActiveRecord::Base 
    belongs_to :author, class_name: "User" 
end 
0

Убедитесь, что ваш комментарий индексируются с пользователем и постом.

модель Пользователь:

User model: class User < ActiveRecord::Base 
    has_many :posts, dependent: :destroy 
end 

сообщение модель

class Post < ActiveRecord::Base 
    belongs_to :user 
    has_many :comments, dependent: :destroy 
end 

комментарий модель

class Comment < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :author, class_name: "User", foreign_key: "user_id" 
end 

В ваших просмотров:

<% if @comments.any? %> 
     <% @comments.each do |comment| %> 
       <p><%= comment.author.full_name %>: <%= comment.content %></p> 
     <% end %> 
<% end %> 

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

  • Нет связанных вопросов^_^