Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

load partial with jquery and rails

Im curious about what the best way to load a rails partial with jquery. So far I have tried a solution not working:

$('#imagecontent').load('/newsletters/_image_gallery.html.erb', function() {
alert('Load was performed.');
});

Is the best solution to build a seperate action and/or controller for this and set up a route? Im asking because making the first solution work seems more easy, perhaps not so restful.

Thanks.

like image 794
Christian Avatar asked Feb 09 '10 14:02

Christian


5 Answers

You should not be able to access Template files (.erb) from HTTP requests, this is very bad practice. I suggest you put them outside your web servers path and access them only through your application.

I'm not sure about Rails, but I suppose you need to create a separate controller (or whatever) to do this.

EDIT this is because .erb files are Embedded Ruby files, and if you try to request them you will get all unwanted data, like <%= page_title %>, that you don't want to show the users. Therefore you need to pass these .erb files through your Rails application so that they are properly interpreted into HTML.

like image 60
Luca Matteis Avatar answered Nov 19 '22 11:11

Luca Matteis


The reason that code doesn't work is that rails doesn't expose view files outside. To achieve the thing you want, you'll need an action which would render this partial:

def image_gallery
  render :partial => "image_gallery"
end

Also there is a plugin called jRails which replaces standard ajax helpers (which use prototype) with equivalent jquery-oriented ones. In your case you would use something like

<%= remote_function(:update => "imagecontent", :url => "/newsletters/image_gallery") %>

And even more, in Rails 3 you won't need it. See this link.

like image 32
alex.zherdev Avatar answered Nov 19 '22 11:11

alex.zherdev


Here's what you want:

http://www.slideshare.net/JamesEdwardGrayII/ajax-with-jquery-in-rails

like image 3
volante Avatar answered Nov 19 '22 12:11

volante


Another alternative:

$('#imagecontent').html('<%= escape_javascript render 'newsletters/image_gallery' %>');
like image 3
Dario Barrionuevo Avatar answered Nov 19 '22 11:11

Dario Barrionuevo


With rails 3 you could do...

controller

@content = '/some/partial'

view - either haml.erb(html.erb) or js.erb

$('#myDiv').html("<%= escape_javascript render @content %>");

You could try this if rails 2 (only prototype available unless noConflict added)...

In the controller

@content = render :partial=>"/users/cool_partial"

Call your js

myFunction(#{@content.to_json})

Your function...

myFunction = function(content){

    $("myDiv").html(content);

}

I do agree with neutrino that this could be better handled via an action.

def get_partial
  render 'some/partial'
end

Hope this helps

like image 3
Dan Avatar answered Nov 19 '22 12:11

Dan