Связывание связанных объектов не позволит мне вызывать их атрибуты Rails

#ruby-on-rails #ruby #methods #associations

#ruby-on-rails #ruby #методы #ассоциации

Вопрос:

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

show.html.slim:

 - if notice != nil
p#notice.alert.alert-success role='alert' = notice

h1 Blog Post

h4 Title: #{@blog_post.title}

h4 Author: #{@blog_post.user.name}

h4 Entry:
p = @blog_post.blog_entry

= render partial: 'comments/form', locals: { comment: @comment }

.panel.panel-default
  .panel-heading
    h4 Comments
  #js-comments.panel-body
    = render partial: 'comments/comment', collection: @blog_post.comments

= link_to 'Feed', blog_posts_path, class: 'btn btn-primary'
 

Проблема в комментариях / комментариях частично:

 .panel-body
  p
    strong
      = comment.user.username
    |  said at 
    span.posted-at
      = comment.created_at.strftime('%m/%d/%Y %H:%M:%S')
    | : 
  p = comment.comment_entry
  - if policy(comment).update?
    = link_to 'Edit Comment', edit_blog_post_comment_path(comment.blog_post, comment), class: 'btn btn-primary'
  - if policy(comment).destroy?
    = link_to 'Destroy Comment', [comment.blog_post, comment], method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-primary'
 

Теперь, когда я вызываю comment.user.username или comment.created_at.strftime, я получаю сообщения NoMethodError, в которых говорится, что username и strftime являются неопределенными методами. Однако, если я вызываю comment.user и comment.created_at , это работает просто отлично. По какой-то причине это просто не позволит мне добавить этот дополнительный метод в цепочку. Я могу убедиться, что между пользователем, blog_post и комментариями установлены все правильные ассоциации.

На всякий случай, вот мой контроллер блога для страницы показа:

 def show
  @comment = @blog_post.comments.new
end
 

Буду признателен за любую помощь. Спасибо!

Редактировать:

Сообщение об ошибке:

 undefined method `username' for nil:NilClass
 

и better_errors сообщает мне, что проблема связана с комментарием, частичным в

 comment.user.username
 

и на странице показа, где он вызывает частичное

 = render partial: 'comments/comment', collection: @blog_post.comments
 

Спасибо!

Комментарии:

1. Вы пробовали проверять переменную comment в вашем partial?

2. Кроме того, вы не вызываете атрибуты — вы вызываете цепные методы — некоторые из них являются получателями атрибутов. Но это довольно важное различие.

3. У меня есть, и если я удалю username и strftime из цепочек методов, это действительно сработает, что мне кажется таким странным.

4. Можете ли вы опубликовать ошибку и трассировку стека.

5. Я только что опубликовал это как редактирование в исходном сообщении. Я надеюсь, что это поможет некоторым

Ответ №1:

Комментарий, инициализированный в контроллере, добавляется в @blog_post.comments, но у него нет user или created_at . Просто измените свой контроллер на @comment = Comment.new