从 helper_method 渲染局部视图

8

好的,所以我在应用程序控制器中有一个帮助方法:

def run_test(test_name)
  #computation stuff
  render :partial => test_name
end

在视图中,我这样调用它:

<%= run_test("testpartial") %>

只有一个呈现正常(尽管...渲染偏见似乎返回一个数组而不仅仅是局部内容?),但是如果我在视图中两次调用run_test助手,则会出现双重渲染错误,这不应该发生在部分视图中。

有什么想法吗?


你使用的是哪个版本的Ruby和Rails?我在运行3.1时没有遇到这种情况。 - Benoit Garret
3.1. 我之前使用的是一个RC候选版本,但我为了确保问题不出在这里,升级了最新版本,但它仍然无法正常工作。 - Msencenb
嗯...原来我是在application_controller中使用helper_method :run_test定义这个辅助方法,但将其移动到helpers文件夹中的application_helper文件中就可以了。所以...我对于在应用程序控制器中定义的辅助程序和在辅助文件中定义的辅助程序之间的区别有一些理解上的漏洞。有人能帮我填补一下吗? - Msencenb
1
应用控制器中的方法仅对控制器可用。帮助程序中的方法仅对视图可用。 - drummondj
1
谢谢约翰。如果你想把它作为答案添加,我很乐意为你标记它 :) - Msencenb
3个回答

9

render在控制器中和视图中是不同的方法。控制器最终会在视图上调用render,但是控制器自己的render方法只希望被调用一次。它的格式如下:

# Check for double render errors and set the content_type after rendering.
def render(*args) #:nodoc:
  raise ::AbstractController::DoubleRenderError if response_body
  super
  self.content_type ||= Mime[formats.first].to_s
  response_body
end

注意如果被多次调用会如何抬高?

当您调用helper_method时,您为视图提供了一个代理,使其可以访问控制器版本的render,但这并不意味着它应该像ActionView的版本那样使用。ActionViewrender期望被反复调用以呈现局部内容等,而控制器的版本则不是这样。


5

看起来在Rails 3.2中,这只是有效的:

# application_helper.rb
def render_my_partial
  render "my_partial"
end

1
这在Rails 3.0中也适用。在我看来,这似乎是最好的答案。 - sockmonk
1
我必须在名为"_my_partial.html.erb"的局部文件上使用渲染"my_partial.html.erb",但这起作用了。 - Craig Wetzelberger
问题具体是如何在控制器的helper_method公开的方法中呈现partial。这并没有解决问题。 - numbers1311407

-2
你可以尝试在视图辅助函数中使用 render_to_string 方法。
render_to_string :partial => test_name, :layout => false

4
render_to_string 在视图助手中不可用。 - YWCA Hello
对我来说,这个可行。render_partial "/static/partials/rightCol/_related" - Mukesh Salaria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接