2010-11-02 15 views
5

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

例如:

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

听起来很直接,我有它的工作,所以我可以显示我已播种的评论。我只是无法获得一份表格来工作,将新的英寸。任何帮助表示赞赏。

+1

http://www.arailsdemo.com/posts/16可能会有所帮助。 – monocle 2010-11-03 05:02:23

回答

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 
+0

我欣赏信息和你的批评。我会研究那本书。我想这里扔了我的是,我用另一个模型展示了另一个模型。我想这并不像我想的那么困难。再次感谢。 – 2010-11-03 17:33:00

+0

我想我几乎在那里,但路线正在打破。 map.resources语句如何转化为Rails 3的路由方式? Rails 3的变化是很多给我带来麻烦的。 – 2010-11-03 18:56:48

+0

我通过获取正确的路由信息​​得到了这个工作。 – 2010-11-05 03:41:14

27

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

class Post < ActiveRecord::Base 
acts_as_commentable 
end 

然后在视图说帖子#显示

<%= 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] 

希望这会让你运转起来。

+10

没有snark的好回答(如上所示)。非常感激。 – daspianist 2013-02-27 03:24:40

+1

同意,snark没有意义。这个答案应该是upvoted – echan00 2014-12-10 02:25:15

+1

在控制器代码中,'Post.new'不应该是'Comment.new'而是?? – miguelfg 2015-10-27 09:33:15

1

这是一个老问题,但我想在我的解决方案抛出,以及宝石的README仍然毕竟这些年来无益。它建立在Kunday的答案上。以下是使用act_as_commentable gem的教程...

  1. 允许用户在每个帖子下创建注释。
  2. 显示属于帖子的所有评论。

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

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

首先,在要使用commentable gem的模型中,添加以下行,如gem的README中所建议的。

class Post < ActiveRecord::Base 
    acts_as_commentable 
end 

然后用create操作创建一个新的评论控制器。请注意,:authenticate_user!是devise的一部分,它是创建简单认证的宝石。 current_user也是devise作为帮手的一部分。如果您想在评论主体下显示用户的名称/电子邮件,则需要此名称。

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的展示视图中,我们将添加表单。该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> 

现在在Post show视图下显示每条评论。

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

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

最后,为了在展会页面存在@comments,去安置自己的控制器,并在展会上,添加以下内容:

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

这应该是良好的需求。祝你好运。