Comment 和 User 之间存在 belongs_to 关联的奇怪错误
Strange error with belongs_to association between Comment and User
我有三个模型:用户模型、Post 模型和评论模型。用户可以创建一个 post,然后在 post 的显示页面中,有一个评论列表,其中包含 post 评论的表单。评论被 post 编辑并显示在 post 的显示页面上。我选择将评论嵌套在 post 中,而让用户无动于衷。这是我的 routes.rb 和我的每个模型
resources :users, except: [:index]
资源:posts,除了:[:index, :edit, :update] do
资源:评论,仅:[:创建,:销毁]
结束
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"
我的问题在于用户和评论之间的关联(我相信)。在我的 post/show 视图中,我有以下代码:
<% if @comments.any? %>
<% @comments.each do |comment| %>
<p><%= comment.author_id %>: <%= comment.content %></p>
<% end %>
<% end %>
此代码有效,例如它会打印以下评论(假设创建它的用户的 ID 为 15)
15:这是评论
由此,我很清楚它正在了解其作者是谁。但问题是:当我尝试打印出以下内容时:
<p><%= comment.author.full_name %>: <%= comment.content %></p>
它给我这个 "Action Controller: Exception Caught" 错误:
"undefined method `username' for nil:NilClass"
协会是不是应该可以帮我接作者(用户)的full_name属性?我知道我在这里遗漏了一些东西,非常感谢任何帮助。我还将在下面包括我的 posts 控制器和评论控制器。
我的 posts 控制器显示动作:
def show
@post = Post.find(params[:id])
@comment = @post.comments.build
@comments = @post.comments
end
这是我的评论控制器创建操作,后跟我的强参数:
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
确保您的评论已被用户和 post 索引。
用户模型:
User model: class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
end
Post 型号
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 %>
该错误表明您的关联存在问题。
快速解决方法是使用 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
我有三个模型:用户模型、Post 模型和评论模型。用户可以创建一个 post,然后在 post 的显示页面中,有一个评论列表,其中包含 post 评论的表单。评论被 post 编辑并显示在 post 的显示页面上。我选择将评论嵌套在 post 中,而让用户无动于衷。这是我的 routes.rb 和我的每个模型
resources :users, except: [:index]
资源:posts,除了:[:index, :edit, :update] do 资源:评论,仅:[:创建,:销毁] 结束
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"
我的问题在于用户和评论之间的关联(我相信)。在我的 post/show 视图中,我有以下代码:
<% if @comments.any? %>
<% @comments.each do |comment| %>
<p><%= comment.author_id %>: <%= comment.content %></p>
<% end %>
<% end %>
此代码有效,例如它会打印以下评论(假设创建它的用户的 ID 为 15)
15:这是评论
由此,我很清楚它正在了解其作者是谁。但问题是:当我尝试打印出以下内容时:
<p><%= comment.author.full_name %>: <%= comment.content %></p>
它给我这个 "Action Controller: Exception Caught" 错误:
"undefined method `username' for nil:NilClass"
协会是不是应该可以帮我接作者(用户)的full_name属性?我知道我在这里遗漏了一些东西,非常感谢任何帮助。我还将在下面包括我的 posts 控制器和评论控制器。 我的 posts 控制器显示动作:
def show
@post = Post.find(params[:id])
@comment = @post.comments.build
@comments = @post.comments
end
这是我的评论控制器创建操作,后跟我的强参数:
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
确保您的评论已被用户和 post 索引。
用户模型:
User model: class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
end
Post 型号
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 %>
该错误表明您的关联存在问题。
快速解决方法是使用 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