comment.user.username 未在 show.html.erb 上工作

comment.user.username not working on show.html.erb

我正在尝试一个简单的功能,用户可以在其中评论调查 post,但评论 .user.username 不起作用,它正在呈现 comment.user 但不支持用户属性

create_table "comments", force: :cascade do |t|
t.string "content"
t.integer "inquest_id"
t.integer "user_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["inquest_id"], name: "index_comments_on_inquest_id"
t.index ["user_id"], name: "index_comments_on_user_id"
end

comment_model

class Comment < ApplicationRecord
belongs_to :inquest 
belongs_to :user
end

user_model简单评论多关联

评论控制器的创建方法

  def create

@comment = Comment.new(comment_params)

pp comment_params
@inquest = Inquest.find(params[:inquest_id])
@comment = Comment.new(comment_params)
@comment.inquest = @inquest
@comment.user = current_user
respond_to do |format|
  if @comment.save
    format.js do
      @inquest = Inquest.find(params[:inquest_id])

    end
  else
    format.html { render :new, status: :unprocessable_entity }
    format.json { render json: @comment.errors, status: :unprocessable_entity }
  end
end
end

我正在调查 show.html.erb

中呈现评论
Showing /Users/zunairaihsan/Desktop/fyp_ed_bolt/app/views/inquests/show.html.erb 
   where line #123 raised:

 undefined method `user_name' for nil:NilClass

我已经尝试了大部分可能的方法,但还是不行working.please让我知道哪里错了

我假设您在 inquests/show.html.erb 中显示了多个评论,例如

<%= @inquest.comments.each do |comment| %>
  <%= comment.user.user_name %>
  <%= comment.content %>
<% end %>

许多评论将毫无问题地呈现。 Comment 模型和数据库不允许 user_idnil

但好像一条评论的 user_id 在用户 table 中没有相应的 id。当您试图弄清楚发生了什么并删除 user_name

<%= @inquest.comments.each do |comment| %>
  <%= comment.user %>
  <%= comment.content %>
<% end %>

偷偷摸摸的损坏评论可能不会向您显示任何内容,comment.usernil,并且因为您没有对 comment.content 进行验证,所以它也可能是 nil

首先,删除没有 user 的评论以验证这是问题所在:

# this is fast enough for a few thousand comments
>> Comment.find_each { |comment| comment.destroy unless comment.user }

在此之后 inquests/show.html.erb 应该可以正常工作了。

为确保不再发生这种情况:

class User
  # this will delete all `user.comments` when you destroy `user`
  has_many :comments, dependent: :destroy

  # ...
end

要真正确保不再发生这种情况:

class CreateComment < ActiveRecord::Migration[7.0]
  def change
    create_table :comments do |t|
      t.references :user, null: false, foreign_key: true
      
      # ...
    end
  end
end

使用 foreign_key 约束,如果用户有评论,您的数据库将不允许您销毁该用户。这与 dependent: :destroy 协同工作。如果你删除一个用户并且 rails 自动销毁所有 user.comments,那么数据库不会抱怨。

可能对 inquest 做同样的事情,如果它不是可选的话。

没有content的评论也不是真正的评论:

class Comment < ApplicationRecord
  belongs_to :inquest 
  belongs_to :user

  validates :content, presence: true
end