【问题标题】:Why doesn't this partial render with UJS / jQuery?为什么不使用 UJS / jQuery 进行部分渲染?
【发布时间】:2010-09-09 07:32:02
【问题描述】:

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

查看下面的更新结果

create.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 %>
...

posts_controller.rb:

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

当我提交帖子表单时,它会将 #{render(:partial =&gt; '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)

【问题讨论】:

    标签: jquery ruby-on-rails-3 ujs


    【解决方案1】:

    你缺少 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

    【讨论】:

    • 我得到了一个 ActionView::Template::Error 。我在我的问题中发布了输出。
    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    相关资源
    最近更新 更多