# Render :update and controller private methods

**URL:** <https://www.ruby-forum.com/t/render-update-and-controller-private-methods/122243>\
**Category:** Rails\
**Created:** [December 5, 2007, 9:17pm UTC](https://www.ruby-forum.com/t/render-update-and-controller-private-methods/122243 "2007-12-05T21:17:49Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![kevin\_cline](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/3d9bf3/32.png) [@kevin\_cline](https://www.ruby-forum.com/u/kevin_cline)\
**Post date:** [December 5, 2007, 9:17pm UTC](https://www.ruby-forum.com/t/render-update-and-controller-private-methods/122243/1 "2007-12-05T21:17:49Z")

</div>

Probably asked and answered, but…

Why are controller private methods inaccessible inside the block  
passed to render :update ?

This does not work:

class MyController \< ApplicationController

def some\_action  
render :update do |page|  
page.replace\_html ‘an\_element’, some\_private\_method  
end  
end

private

def some\_private\_method  
return ‘data’  
end  
end

---

<div class="post-metadata">

**Author:** ![kevin\_cline](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/3d9bf3/32.png) [@kevin\_cline](https://www.ruby-forum.com/u/kevin_cline)\
**Post date:** [December 6, 2007, 5:11pm UTC](https://www.ruby-forum.com/t/render-update-and-controller-private-methods/122243/2 "2007-12-06T17:11:04Z")

</div>

I think this works:

class MyController \< ApplicationController

def some\_action  
some\_private\_method  
render :update do |page|  
page.replace\_html ‘an\_element’, variable\_name  
end  
end

private

def some\_private\_method  
variable\_name = return ‘data’  
end  
end

---

<div class="post-metadata">

**Author:** ![kevin\_cline](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/3d9bf3/32.png) [@kevin\_cline](https://www.ruby-forum.com/u/kevin_cline)\
**Post date:** [December 6, 2007, 5:28pm UTC](https://www.ruby-forum.com/t/render-update-and-controller-private-methods/122243/3 "2007-12-06T17:28:12Z")

</div>

On 6 Dec 2007, at 16:10, ebrad wrote:

> I think this works:

Guaranteed not to work - you’re just creating a local\_variable in a  
completely different scope.  
Like i said in a similar thread, a render :update block behaves like a  
normal view: instance variable are copied over. If you want controller  
instance methods to be available, they need to be helper methods (see  
documentation for helper\_method)

Fred

---

<div class="post-metadata">

**Author:** ![kevin\_cline](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/3d9bf3/32.png) [@kevin\_cline](https://www.ruby-forum.com/u/kevin_cline)\
**Post date:** [December 6, 2007, 6:45pm UTC](https://www.ruby-forum.com/t/render-update-and-controller-private-methods/122243/4 "2007-12-06T18:45:09Z")

</div>

Frederick C. wrote:

> Like i said in a similar thread, a render :update block behaves like a  
> normal view: instance variable are copied over. If you want controller  
> instance methods to be available, they need to be helper methods (see  
> documentation for helper\_method)

That’s useful to know.

An alternative is to call controller instance methods from inside  
the render block like “controller.meth”, or “controller.send(:meth)”  
for private methods.

–  
We develop, watch us RoR, in numbers too big to ignore.

---

<div class="post-metadata">

**Author:** ![kevin\_cline](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/3d9bf3/32.png) [@kevin\_cline](https://www.ruby-forum.com/u/kevin_cline)\
**Post date:** [December 14, 2007, 11:13pm UTC](https://www.ruby-forum.com/t/render-update-and-controller-private-methods/122243/5 "2007-12-14T23:13:24Z")

</div>

On Dec 6, 11:40 am, Mark Reginald J. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Frederick C. wrote:
> 
> > Like i said in a similar thread, a render :update block behaves like a  
> > normal view: instance variable are copied over. If you want controller  
> > instance methods to be available, they need to be helper methods (see  
> > documentation for helper\_method)
> 
> That’s useful to know.

Yes, but somewhat unexpected. But

> An alternative is to call controller instance methods from inside  
> the render block like “controller.meth”, or “controller.send(:meth)”  
> for private methods.

Thanks for that. Ruby is the only language I have that used  
that supports closures while also allowing methods to be called  
without an  
explicit object. I expected that ‘self’ would be bound inside  
the closure at the time the closure was defined.
