#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