1

Rails3プロジェクトでフォームを使用して投稿を作成するためにjQueryを使用しようとしています。これが私が持っているものです:

更新された結果については、以下をご覧ください

create.js.erb:

$("#posts").prepend("#{render(:partial => 'posts')}");

layouts / application.html.erb:

...
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<%= javascript_include_tag 'rails' %>
<%= csrf_meta_tag %>
...

post_controller.rb:

def create
  @post = Post.new(params[:post])
  respond_to do |format|
    if @post.save
      # ...
      format.js
    else
      # ...
    end
  end
end

投稿フォームを送信すると#{render(:partial => 'posts')}、投稿ajaxのあるべき場所のようなテキストが表示されます。

編集:に変更することによってcreate.js.erb

$("#posts").prepend("<%= render(:partial => 'posts')%>");

フォームを送信すると、ターミナルで次のエラーが発生します。

Rendered posts/_posts.html.erb (13.6ms)
Rendered posts/create.js.erb (80.4ms)
Completed   in 1631ms

ActionView::Template::Error (You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each):
    1: <%- for post in @posts -%>
    2:   <div class="post">
    3:     <%= link_to post.title, post %>
    4:     <%- if post.name? -%> 
  app/views/posts/_posts.html.erb:1:in     `_app_views_posts__posts_html_erb___692646030_16112196__738457576'
  app/views/posts/create.js.erb:1:in `_app_views_posts_create_js_erb__431255654_16166988__591965598'
  app/controllers/posts_controller.rb:39:in `create'

Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (10.6ms)
Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (54.3ms)
Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (102.1ms)
4

1 に答える 1

2

erbタグがありません:

$("#posts").prepend("<%=render(:partial => 'posts')%>");

投稿の完全なセットを再度レンダリングしようとしているようですが、本当に1つの投稿をレンダリングしたいと思います。これにより、重複する投稿が表示されます。createメソッドに@posts変数が設定されていないため、nilエラーが発生しました。_postという別のパーシャルを作成し、その中に1つの投稿をレンダリングする必要があります。createメソッドは@postを設定しますが、@postsは設定しないことに注意してください。@postsはnilであるため、ここからエラーが発生します。エラーは、使用しているb/cを少し誤解させるものです。

for post in @posts

Rubyでより広く使用されている次の構文を使用することをお勧めします(これは「for」と同じ効果があります)。

@posts.each do |post|

このrailscastはあなたを助けるかもしれないと思います。ここに表示されている内容に基づいて、ライアンはほぼ同じことを行っていると思いますが、フォームを送信する代わりにポーリング方法を使用しています。単一のコメントをレンダリングするために彼が_comment.html.erbを作成する部分に特に注意してください。

http://railscasts.com/episodes/229-polling-for-changes

于 2010-09-09T14:11:23.320 に答える