1

我正在尝试使用 jQuery 在我的 Rails 3 项目中创建带有表单的帖子。这是我所拥有的:

在下面查看更新的结果

创建.js.erb:

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

布局/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')%>");

看来您正在尝试再次呈现完整的帖子集,并且我假设您确实想要呈现单个帖子。这将导致出现重复的帖子。在您的 create 方法中未设置 @posts 变量,从而导致该 nil 错误。您应该创建另一个名为 _post 的部分并在其中呈现单个帖子。请注意,create 方法设置了@post,但没有设置@posts。这就是您的错误的来源,因为@posts 为零。该错误有点误导您正在使用的 b/c:

for post in @posts

我建议使用以下在 Ruby 中更广泛使用的语法(与“for”具有相同的效果):

@posts.each do |post|

我认为这个 railscast 可以帮助你。根据您在此处显示的内容,我认为 Ryan 正在做几乎完全相同的事情,但使用轮询方法而不是提交表单。特别注意他创建 _comment.html.erb 以呈现单个评论的部分。

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

于 2010-09-09T14:11:23.320 回答