acts_as_commentable例子?

时间:2010-11-02 22:45:31

标签: ruby-on-rails acts-as-commentable

我有一个我想要评论的模型。我在模型的“show”视图上创建表单时遇到困难,该视图将允许创建注释。我没有找到任何好的或有用的例子。任何人都可以指出或向我展示如何做到这一点的例子吗?

示例:

一个简单的博客应用程序。我有一个名为Post的模型。这是可评论的。所以在'show'视图中​​我想显示一个Post,并在底部有一些字段,当完成并提交时,创建一个与帖子关联的新评论并将其放入数据库。

听起来很简单,我让它工作,所以我可以显示我播种的评论。我只是无法获得一个表格来处理新的内容。感谢任何帮助。

3 个答案:

答案 0 :(得分:27)

让我们假设一个Post模型。确保你有

class Post < ActiveRecord::Base
acts_as_commentable
end
然后在发表#show

的观点中
  <%= form_tag "/posts/add_new_comment" do %>
    <%= hidden_field_tag "id", post.id %>
    <%= text_area_tag "comment[comment]" %>
    <%= submit_tag "Post Comment" %>
  <% end %>

然后在PostController中

  def add_new_comment
    post = Post.find(params[:id])
    post.comments << Post.new(params[:comment])
    redirect_to :action => :show, :id => post
  end

和routes.rb

  match "/posts/add_new_comment" => "posts#add_new_comment", :as => "add_new_comment_to_posts", :via => [:post]

希望这能帮到你。

答案 1 :(得分:3)

这是非常非常基本的东西,你显然需要一些更好的结构和方法来学习。购买一本书,例如Agile Web Development with Rails,是唯一真正的学习方式,否则你会在没有真正学到任何东西的情况下从一个问题徘徊到另一个问题。

假设您有一篇想发表评论的帖子。

#routes.rb
map.resources :posts do |post|
  post.resources :comments
end

#post_controller.rb
def show
  @post.find params[:id]
  @comment = @post.comments.new
end

#posts/show.html.erb
<%- form_for [@post, @comment] do |f|-%>
  <%= f.text_area :body -%>
  <%= f.submit -%>
<%- end -%>

#comments_controller
def create
  @post = @post.find params[:post_id]
  @comment = @post.comments.new params[:comment]
  if @comment.save
    redirect_to @post

答案 2 :(得分:1)

这是一个老问题,但我想提出我的解决方案以及宝石的自述文件在这些年后仍然无益。它建立在@Kunday的答案之上。以下是使用act_as_commentable gem的教程......

  1. 允许用户在每个帖子下创建评论。
  2. 显示属于帖子的所有评论。
  3. 这假设您已经有一个正常的博客&#34;,无论是图片还是帖子。安装gem,然后运行rails g comment开始。

    允许用户在每个帖子下创建评论。

    首先,在您想要使用可评论gem的模型中,按照gem的自述文件中的建议添加以下行。

    class Post < ActiveRecord::Base 
      acts_as_commentable
    end
    

    然后使用create操作创建一个新的评论控制器。请注意,:authenticate_user!是设计的一部分,它是创建简单身份验证的宝石。 current_user也是设计帮助者的一部分。如果您想在评论正文下显示用户的姓名/电子邮件,则需要它。

    class CommentsController < ApplicationController
      before_action :authenticate_user!
    
      def create
        post = Post.find_by(id: params[:id])
        comment = post.comments.build(comment_params)
        comment.user = current_user
    
        if comment.save
          flash[:notice] = "Comment has been created."
          redirect_to post
        else
          flash[:alert] = "Comment has not been created."
        end
      end
    
      private    
        def comment_params
          params.permit(:comment)
        end
    end
    

    接下来,设置路线。就是这样。这意味着当有人向评论发送帖子请求时,我们将运行在评论控制器内创建操作。

    post 'comments' => 'comments#create', as: "create_comment"
    

    as: "create_comment"为其添加了别名,因此您可以执行create_comment_path。现在,在Post的show视图中,我们将添加表单。 div将帮助您添加CSS。

    <div class="comment-section">
      <%= form_tag create_comment_path, method: "post" do %>
        <%= hidden_field_tag "id", @post.id %>
          <%= text_area_tag :comment %>
          <%= submit_tag "Submit" %>
        <% end %>
    </div>
    

    现在在帖子显示视图下显示每条评论。

    div将帮助您添加css,如果您的User类具有名称列,comment.user.name将起作用。否则,将其更改为email或您选择使用的任何标识符。

    <div class="comment_list">
      <% @comments.each do |comment| %>
        <%= comment.comment %> <br>
          <%= comment.user.name %> <br>
            <br>
        <% end %>
    </div>
    

    最后,为了让@comments存在于显示页面中,请转到Post控制器,然后在show下添加以下内容:

      def show
        @post = Post.find_by(id: params[:id])
        @comments = @post.comments.all
      end
    

    这应该符合要求。祝你好运。