Rails Render locals 的问题

jokry · October 17, 2012 · Last by huacnlee replied at October 18, 2012 · 2651 hits

为了实现 Comments 的 Ajax 提交,为 create 方法添加了 create.js.erb 来实现:

其中在 append 的渲染结果时,我需要引入当前总评论数

A 写法 (成功)

$('#comments').append('<%= escape_javascript(render @comment, {:comment_counter => @comments_size} ) %>');

B 写法(失败,由于 comment_counter 未定义)

$('#comments').append('<%= escape_javascript(render @comment, :locals => {:comment_counter => @comments_size } ) %>');

我想了解的是,为什么加了 locals 却不行呢?

https://github.com/rails/rails/blob/0d3d9a150a4ba1084cf28fd26be2a154f4540952/actionpack/lib/action_view/helpers/rendering_helper.rb#L27

def render(options = {}, locals = {}, &block)
  case options
  when Hash
    if block_given?
      view_renderer.render_partial(self, options.merge(:partial => options[:layout]), &block)
    else
      view_renderer.render(self, options)
    end
  else
    view_renderer.render_partial(self, :partial => options, :locals => locals)
  end
end

如果第一个参数不是 Hash 的话,将会执行

view_renderer.render_partial(self, :partial => options, :locals => locals)

render @comment, :locals => {:comment_counter => @comments_size} 这样将会 :locals 参数将会被忽略掉

所以你应该

render(:partial => @comment, :locals => {:comment_counter => @comments_size})
# 或者
render(@comment, {:comment_counter => @comments_size})
2 Floor has deleted
You need to Sign in before reply, if you don't have an account, please Sign up first.