【问题标题】:acts_as_commentable examples?act_as_commentable 的例子?
【发布时间】:2010-11-02 22:45:30
【问题描述】:

我有一个想要发表评论的模型。我很难在模型的“显示”视图上创建一个允许创建 cmets 的表单。我没有找到任何好的或有用的例子。任何人都可以指点我或向我展示如何执行此操作的示例吗?

例子:

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

听起来很简单,而且我已经让它工作了,所以我可以显示我已经播种的 cmets。我只是无法使用表格来放入新表格。感谢您提供任何帮助。

【问题讨论】:

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


【解决方案1】:

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

class Post < ActiveRecord::Base
acts_as_commentable
end

然后在视图中说 Post#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]

希望这能让你启动并运行。

【讨论】:

  • 没有陷阱的好答案(如上所示)。非常感谢。
  • 在控制器代码中,“Post.new”不应该是“Comment.new”吗??
【解决方案2】:

这是非常非常基本的东西,你显然需要一些更好的结构和方法来学习。买一本书,比如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

【讨论】:

  • 感谢您的信息和批评。我会研究那本书。我想在这里让我失望的是我正在使用一个模型和另一个模型的展示视图。我想这并不像我想象的那么难。再次感谢。
  • 我想我快到了,但路线正在中断。 map.resources 语句如何转换为 Rails 3 的路由方式? Rails 3 的变化给我带来了很多麻烦。
  • 嘿新泽西州。对不起,我没有回复你。我还没有使用 Rails 3,所以不知道路由的变化。如果您将它们包括在这里,我会将它们放在我的答案中,以防对其他人有所帮助。
【解决方案3】:

这是一个老问题,但我想提出我的解决方案,而且这些年来 gem 的 README 仍然没有帮助。它建立在@Kunday 的回答之上。以下将是使用 act_as_commentable gem 的教程...

  1. 允许用户在每个帖子下创建 cmets。
  2. 显示属于某个帖子的所有 cmets。

这假设您已经有一个工作“博客”,无论是图片还是帖子。安装 gem,然后运行 ​​rails g comment 开始。

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

首先,在您要使用可注释 gem 的模型中,按照 gem 的 README 中的建议添加以下行。

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

接下来,设置路线。就是这个。这意味着当有人向 cmets 发送 post 请求时,我们将在 cmets 控制器中运行创建操作。

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

as: "create_comment" 给它一个别名,所以你可以使用create_comment_path。现在,在 Post 的显示视图中,我们将添加表单。 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,comment.user.name 将在您的 User 类具有名称列时起作用。否则,将其更改为 email 或您选择使用的任何标识符。

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

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

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

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

【讨论】:

  • 这篇文章救了我。 gem 页面上的说明没有提到在保存评论之前必须将用户分配给评论,我得到了一个错误。谢谢!
猜你喜欢
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2011-05-04
  • 2012-10-10
  • 2011-01-24
  • 2016-10-23
  • 2021-10-18
相关资源
最近更新 更多