2015-06-22 37 views
0

試圖在我的reddit類型應用程序中使用Ajax來創建一些漂亮的即時顯示評論。儘管如此,仍然試圖獲得一些ruby語法。我在將我的表單部分與我的評論控制器集成時遇到問題。我來了一個NameError,特別是:使用Ajax/Rails創建評論 - 名稱錯誤

未定義的局部變量或方法'後」的#<#:0x007f8e36d05d88>

我有一些模糊的想法如何解決它(其中地方我在初始化變量評論控制器?),但無法應用工作解決方案。

這裏是我對應的_form.html.rb部分我的評論。

<%= form_for [post, post.comments.build], remote: true do |f| %> 
    <% if post.errors.any? %> 
    <div class="alert alert-danger"> 
     <h4>There are <%= pluralize(post.errors.count, "error") %>.</h4> 
     <ul> 
     <% post.errors.full_messages.each do |msg| %> 
      <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 
    <%= form_group_tag(post.errors[:body]) do %> 
    <%= f.label :body %> 
    <%= f.text_area :body, rows: 1, class: 'form-control', placeholder: "Enter comment" %> 
    <% end %> 
    <div class="form-group"> 
    <%= f.submit "Save", class: 'btn btn-success' %> 
    </div> 
<% end %> 

這裏是我的comments_controller.rb

class CommentsController < ApplicationController 
    def create 
    @post = Post.find(params[:post_id]) 
    @comments = @post.comments 

    @comment = current_user.comments.build(comment_params) 
    @comment.post = @post 
    @new_comment = Comment.new 

    authorize @comment 

    if @comment.save 
     flash[:notice] = "Comment was saved" 
    else 
     flash[:error] = "There was an error saving the comment. Please try again." 
    end 

    respond_to do |format| 
    format.html 
    format.js 
    end 

    def destroy 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.find(params[:id]) 
    authorize @comment 

    if @comment.destroy 
     flash[:notice] = "Comment was removed." 
    else 
     flash[:error] = "Comment couldn't be deleted. Try again" 
    end 

    respond_to do |format| 
     format.html 
     format.js 
    end 
    end 

    private 

    def comment_params 
    params.require(:comment).permit(:body) 
    end 
end  

任何有建設性的意見表示讚賞。請讓我知道,如果你需要額外的意見不同的目錄。先謝謝你!

*從評論螺紋(評論/ create.js.erb文件)

<% if @comment.valid? %> 
    $('.js-comments').prepend("<%= escape_javascript(render(@comment)) %>"); 
    $('.new-comment').html("<%= escape_javascript(render partial: 'comments/form', locals: { post: @post, comment: @new_comment }) %>"); 
<% else %> 
    $('.new-comment').html("<%= escape_javascript(render partial: 'comments/form', locals: { post: @post, comment: @comment }) %>"); 
<% end %> 
+0

你如何調用一個部分?向我們顯示該代碼。 – Pavan

+0

完成。請參閱上文。 – Kris

回答

0

更改後要求視圖爲@Post:

<% if @comment.valid? %> 
    $('.js-comments').prepend("<%= escape_javascript(render(@comment)) %>"); 
    $('.new-comment').html("<%= escape_javascript(render partial: 'comments/form', locals: { @post: @post, comment: @new_comment }) %>"); 
<% else %> 
    $('.new-comment').html("<%= escape_javascript(render partial: 'comments/form', locals: { @post: @post, comment: @comment }) %>"); 
<% end %> 

而在你的形式做的:

<%= form_for [@post, @post.comments.build], remote: true do |f| %> 

希望這能解決您的問題。

0

在您的控制器中,您聲明實例變量@post。但在你看來,你正在使用本地變量post。實例變量屬於對象,而局部變量具有普通的舊詞法作用域。

Rails從控制器獲取所有實例變量並將它們導出到所謂的視圖上下文中。這就是爲什麼他們似乎神奇地出現。這經常讓初學者感到困惑。

1

你的看法形式應該是這個

<%= form_for [@post, @post.comments.build], remote: true do |f| %> 
    <% if @post.errors.any? %> 
    <div class="alert alert-danger"> 
     <h4>There are <%= pluralize(@post.errors.count, "error") %>.</h4> 
     <ul> 
     <% @post.errors.full_messages.each do |msg| %> 
      <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 
    <%= form_group_tag(@post.errors[:body]) do %> 
    <%= f.label :body %> 
    <%= f.text_area :body, rows: 1, class: 'form-control', placeholder: "Enter comment" %> 
    <% end %> 
    <div class="form-group"> 
    <%= f.submit "Save", class: 'btn btn-success' %> 
    </div> 
<% end %> 
相關問題