2010-11-02 68 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 

這應該是良好的需求。祝你好運。