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_id
为 nil
。
但好像一条评论的 user_id
在用户 table 中没有相应的 id
。当您试图弄清楚发生了什么并删除 user_name
<%= @inquest.comments.each do |comment| %>
<%= comment.user %>
<%= comment.content %>
<% end %>
偷偷摸摸的损坏评论可能不会向您显示任何内容,comment.user
是 nil
,并且因为您没有对 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
我正在尝试一个简单的功能,用户可以在其中评论调查 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_id
为 nil
。
但好像一条评论的 user_id
在用户 table 中没有相应的 id
。当您试图弄清楚发生了什么并删除 user_name
<%= @inquest.comments.each do |comment| %>
<%= comment.user %>
<%= comment.content %>
<% end %>
偷偷摸摸的损坏评论可能不会向您显示任何内容,comment.user
是 nil
,并且因为您没有对 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