Rendering an action (with layout) into a Javascript template

Hi everyone

I have an action:

def index   @settings = Setting.all(:order => 'name')

  respond_to do |format|     format.html     format.js   end end

and corresponding views:

index.html.erb:

<h1>Settings</h1> ...

index.js.erb

$("<%= escape_javascript(render XXX) %>").bigDialog();

So what's happening is that for HTML requests the HTML template will be rendered (inside application.html.erb) and for Javascript requests I want the HTML template to be rendered as a string into the Javascript snippet so that jQuery can throw out a dialog. The catch is that dialogs have a separate layout file, dialog.html.erb.

Is there a way to render a template with a layout into my Javascript snippet where I've typed "render XXX"? I've looked at render_to_string but that breaks MVC by taking view material into the controller.

Ideally, I'd like something like render(:action => 'index.html.erb', :layout => 'dialog') (note index.html.erb to distinguish it from index.js.erb) and have this rendered inline.

Ideas?

Thanks! Tristan

Is there a way to render a template with a layout into my Javascript snippet where I've typed "render XXX"? I've looked at render_to_string but that breaks MVC by taking view material into the controller.

Ideally, I'd like something like render(:action => 'index.html.erb', :layout => 'dialog') (note index.html.erb to distinguish it from index.js.erb) and have this rendered inline.

I think either render :template, or render :action => ..., :format => 'html' would do this

Fred

Thanks for the answer Fred.

After reading the docs for ActionView::Base.render (http://apidock.com/ rails/ActionView/Base/render) I found that ActionView's render is quite different to ActionController's render. Notably, there aren't options for :template or :action. However, there is an option for :file and you can also provide a :layout option which I've done:

$("<%= escape_javascript(render(:file => 'settings/ index.html.erb', :layout => 'layouts/dialog')) %>").bigDialog();

This is works very well but it's long and not very agile with all those full paths.

Going to use this for now but I'm going to keep searching for a more robust solution.

T.