铁路应用程序的博客评论

时间:2015-12-25 21:00:51

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我正在学习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!

因为我想要用户和评论之间的关联。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您已经准备好了模型之间的正确关联,问题是如何更新控制器的操作以使其工作。

如果我对Comment模型有正确的了解,除了post之外,它还有bodyuser属性。

首先,您应该更新当前的代码:

@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)

此时评论尚未保存,因此您有两个选择:

  1. 构建评论后,您可以手动保存:

    @ comment.save

  2. 或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

enter image description here