我正在学习Ruby on Rails并且我正在使用Rails 4.在关于使用评论创建博客应用程序的Rails教程之后,作者写了这个以在comments_controller.rb中创建评论
def create
@post=Post.find(params[:post_id])
@comment=@post.comments.build(params[:post].permit[:body])
redirect_to @post_path(@post)
end
和部分:_form.html.erb
<%= form_for([@post, @post.comments.build]) do |f| %>
<h1><%= f.label :body %></h1><br />
<%= f.text_area :body %><br />
<%= f.submit %>
<% end %>
我想知道我是否只能让当前用户对帖子发表评论,在用户模型和评论模型之间建立了所有适当的关联,这样在显示评论时,我可以通过评论从用户中检索信息。显然,我不只是想使用
before_action :authenticate_user!
因为我想要用户和评论之间的关联。
答案 0 :(得分:2)
如果我理解正确,您已经准备好了模型之间的正确关联,问题是如何更新控制器的操作以使其工作。
如果我对Comment
模型有正确的了解,除了post
之外,它还有body
和user
属性。
首先,您应该更新当前的代码:
@comment = @post.comments.build(params[:post].permit[:body])
看起来像这样:
@comment = @post.comments.build(body: params[:post].permit[:body])
要正确设置body
属性,并与current_user
建立正确的关联,就像这样简单:
@comment = @post.comments.build(body: params[:post].permit[:body],
user: current_user)
此时评论尚未保存,因此您有两个选择:
构建评论后,您可以手动保存:
@ comment.save
或2.将build
替换为create
:
@comment = @post.comments.create(body: params[:post].permit[:body],
user: current_user)
希望有所帮助!
答案 1 :(得分:2)
你所关注的教程不太好。
以下是您应该关注的内容:
#config/routes.rb
resources :posts do
resources :comments #-> url.com/posts/:post_id/comments/new
end
#app/controllers/comments_controller.rb
class CommentsController < ApplicationController
def create
@post = Post.find params[:post_id]
@post.comments.new comment_params #-> notice the use of "strong params" (Google it)
@post.save
end
private
def comment_params
params.require(:comment).permit(:body)
end
end
要向User
添加Comment
,您需要执行以下操作:
#config/routes.rb
resources :posts do
resources :comments #-> url.com/posts/:post_id/comments/new
end
#app/models/user.rb
class User < ActiveRecord::Base
has_many :comments
end
#app/models/comment.rb
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :post
end
#app/controllers/comments_controller.rb
class CommentsController < ApplicationController
before_action :authenticate_user! #-> only if you're using devise
def create
@post = Post.find params[:post_id]
@comment = current_user.comments.new comment_params
@comment.post = @post
@comment.save
end
private
def comment_params
params.require(:comment).permit(:body)
end
end
如果您不确定如何设置has_many/belongs_to
关系,则应创建表格like this: