Render :update and controller private methods

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

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

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

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.

On Dec 6, 11:40 am, Mark Reginald J. [email protected] 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.