我正在尝试添加用户为我的rails网站上的帖子添加评论的功能。
我的数据库中有一个Posts表和一个Users表。我正在使用资源丰富的路线在我的帖子控制器的'show'动作上显示各个帖子。我希望能够在帖子下面显示一个评论框,用户可以在其中输入评论,然后点击提交并让它创建评论。
我尝试制作评论模型,为用户和帖子提供belongs_to关系。我还将has_many关系添加到用户并发布模型。然后,我尝试让评论控制器使用“创建”操作,以便在每个帖子的“展示”操作上处理表单。
我遇到了无法让post_id注入新评论的问题。我可以通过从用户的会话中获取user_id来获取user_id,但是唯一传递给Comments Controller上的“create”操作的是通过表单注释的实际文本。
这是添加此功能的好方法吗?必须有更好的方法,或者我可能只是遗漏了一些东西。
我的帖子控制器'显示'动作:
#PostsController.rb
def show
@post = Post.where(:id => params[:id]).first
if @post.nil?
flash[:error] = "Post does not exist"
redirect_to(root_path)
end
@comment = Comment.new
end
PostsController上'show'操作的'show'视图中的表单:
#views/posts/show.html.erb
<%= form_for @comment do |f| %>
<%= f.text_area(:content, :size => '20x10', :class => 'textarea') %>
<%= f.submit('Create Post', class: 'button button-primary') %>
<% end %>
我的评论控制器'创建'动作:
#CommentsController.rb
def create
@comment = Comment.new(params.require(:comment).permit(:content, :post_id, :user_id))
@comment.user_id = session[:user_id]
#Need to set post_id here somehow
if @comment.valid?
@comment.save
flash[:success] = "Comment added successfully."
redirect_to(post_path(@comment.post))
else
@error = @comment.errors.full_messages.to_s
@error.delete! '[]'
flash.now[:error] = @error
render('posts/show')
end
end
我的帖子模型:
class Post < ApplicationRecord
belongs_to :subject
belongs_to :user
has_many :comments
validates :title, :presence => true,
:length => {:within => 4..75}
validates :content, :presence => true,
:length => {:within => 20..1000}
end
我的评论模型:
class Comment < ApplicationRecord
belongs_to :user
belongs_to :post
validates :content, :presence => true,
:length => {:within => 6..200}
end
答案 0 :(得分:1)
在您的帖子控制器显示操作中,使新评论属于帖子
def show
@post = Post.where(:id => params[:id]).first
if @post.nil?
flash[:error] = "Post does not exist"
redirect_to(root_path)
end
@comment = @post.comments.new # <--- here's the change
end
然后将post_id字段作为隐藏字段添加到表单
<%= form_for @comment do |f| %>
<%= f.hidden_field :post_id %>
<%= f.text_area(:content, :size => '20x10', :class => 'textarea') %>
<%= f.submit('Create Post', class: 'button button-primary') %>
<% end %>
如果不改变评论控制器创建动作,你应该不错。