2009-11-17 32 views
1

好吧...我是rails新手,所以這可能是一個愚蠢的問題,但需要幫助。我剛剛觀看並實施了Ryan Bates關於建立博客的screencaset。你可以在這裏看到它http://media.rubyonrails.org/video/rails_blog_2.mov。這裏是瘦:將我的意見添加到索引視圖... Ruby on Rails

兩個表:職位和意見。一切都很好,包括通過AJAX添加評論。這個博客的默認開發爲您提供了index.html.erb視圖,您可以查看所有的職位

def index 
    @posts = Post.all 


    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
     format.json { render :json => @posts } 
     format.atom 
    end 
    end 

的意見只是通過show.html.erb網頁瀏覽,並通過這個代碼在顯示文件:

<%= render :partial => @post %> 
<p> 
<%= link_to 'Edit', edit_post_path(@post) %> | 
<%= link_to 'Destroy', @post, :method => :delete, :confirm => "Are You Sure" %> | 
<%= link_to 'See All Posts', posts_path %> 
</p> 

<h2>Comments</h2> 
<div id="comments"> 
<%= render :partial => @post.comments %> 
</div> 

<% remote_form_for [@post, Comment.new] do |f| %> 
<p> 
    <%= f.label :body, "New Comment" %><br/> 
    <%= f.text_area :body %> 
</p> 
<p><%= f.submit "Add Comment"%></p> 
<% end %> 

我所試圖做的是得到的評論功能similair表示在index.html.erb視圖(我將用JavaScript隱藏)存在。目前看起來就像這樣:

<h1>Listing posts</h1> 
<%= render :partial => @posts %> 

<%= link_to 'New post', new_post_path %> 

我最初的想法只是把這個完全相同的代碼是在index.html.erb文件show.html.erb文件,但不起作用。我在這裏嘗試了一些東西,但我對Rails(或者編碼方面)還不夠熟悉,但尚未及時做到這一點。我有兩個主要的錯誤。要麼我傳遞了一個nil.comments錯誤或一個未定義的對象/方法(不記得)。

我的問題是我需要包括在post_controller,comments_controller和index.html.erb文件來完成此操作。爲了完整,我在下面的每個代碼中都包含了代碼。

POSTS_CONTROLLER

class PostsController < ApplicationController 
    before_filter :authenticate, :except => [:index, :show] 

    # GET /posts 
    # GET /posts.xml 
    def index 
    @posts = Post.all 


    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
     format.json { render :json => @posts } 
     format.atom 
    end 
    end 

    # GET /posts/1 
    # GET /posts/1.xml 
    def show 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @post } 
    end 
    end 

    # GET /posts/new 
    # GET /posts/new.xml 
    def new 
    @post = Post.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @post } 
    end 
    end 

    # GET /posts/1/edit 
    def edit 
    @post = Post.find(params[:id]) 
    end 

    # POST /posts 
    # POST /posts.xml 
    def create 
    @post = Post.new(params[:post]) 

    respond_to do |format| 
     if @post.save 
     flash[:notice] = 'Post was successfully created.' 
     format.html { redirect_to(@post) } 
     format.xml { render :xml => @post, :status => :created, :location => @post } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /posts/1 
    # PUT /posts/1.xml 
    def update 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     if @post.update_attributes(params[:post]) 
     flash[:notice] = 'Post was successfully updated.' 
     format.html { redirect_to(@post) } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /posts/1 
    # DELETE /posts/1.xml 
    def destroy 
    @post = Post.find(params[:id]) 
    @post.destroy 

    respond_to do |format| 
     format.html { redirect_to(posts_url) } 
     format.xml { head :ok } 
    end 
    end 

    private 

    def authenticate 
    authenticate_or_request_with_http_basic do |name, password| 
     name == "admin" && password == "secret" 
    end 
    end 
end 

COMMENTS_CONTROLLER

class CommentsController < ApplicationController 
    def create 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.create!(params[:comment]) 
    respond_to do |format| 
     format.html { redirect_to @post} 
     format.js 
    end 
    end 
end 

INDEX.HTML.ERB

<h1>Listing posts</h1> 
<%= render :partial => @posts %> 

<%= link_to 'New post', new_post_path %> 
+0

就這樣,我清楚你想要什麼 - 你想列出所有的博客文章和所有的帖子控制器的索引視圖上的評論? – 2009-11-17 06:24:24

+0

是的。我其實從下面的條目中想到了如何做到這一點。我現在正在努力如何將創建註釋功能綁定到此索引視圖中,以便它可用於每個帖子。 – bgadoci 2009-11-17 06:51:46

回答

2

這裏有一個簡單的解決方案。第1步,編輯索引操作以包含屬於每個帖子的所有評論。

def index 
    @posts = Post.all(:include => :comments) 

    respond_to do |format| 
    format.html # index.html.erb 
    format.xml { render :xml => @posts } 
    format.json { render :json => @posts } 
    format.atom 
    end 
end 

第2步,編輯您的索引視圖來顯示每個崗位,其次是它的評論:

<h1>Listing posts</h1> 

<% @posts.each do |post| %> 
    <%= render :partial => post %> 
    <%= render :partial => post.comments %> 
<% end %> 

<%= link_to 'New post', new_post_path %> 

編輯:我不是100%肯定的,包括評論創建表單的最好方式也。我想先試試是這樣的(在index.html.erb):

試着改變你的索引視圖:

<h1>Listing posts</h1> 

<% @posts.each do |post| %> 

    <%= render :partial => post %> 
    <%= render :partial => post.comments %> 

    <% remote_form_for [post, Comment.new] do |f| %> 
    <p> 
    <%= f.label :body, "New Comment" %><br/> 
    <%= f.text_area :body %> 
    </p> 
    <p><%= f.submit "Add Comment"%></p> 
    <% end %> 

<% end %> 

<%= link_to 'New post', new_post_path %> 

這應該呈現「新評論」形式下的特定職位該帖子的評論,但我不知道(沒有實際嘗試)表單提交AJAX是否會成功更新和刷新索引頁面。

+0

謝謝你,那麼多人。我很欣賞這一點。它效果很好。我即將嘗試插入表單,看看是否有效。 – bgadoci 2009-11-17 06:40:36

+0

嘿,人...還有一個問題,如果我想包括收集引用評論控制器的新評論的表單...我該怎麼做?評論控制器代碼如上。基本上,由於你給我的代碼,現在正在顯示的所有評論下面...我怎麼能也允許一個新的評論被提交併與過去相關聯。試圖做到這一切,然後用javascript隱藏。 – bgadoci 2009-11-17 07:03:05