Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I render a partial from .js.erb file in rails 4?

In my rails application I have dragdrop.js.erb in /assets/javascript folder. In which I have an ajax block which should render a partial in a div with an on click action. I tried many things but I can't get it working. Any help would be appreciated.

Here is the code:

 $.ajax({  
   type: "GET",    
   url: "<%=  Rails.application.routes.url_helpers.cookbooks_path %>",
   success: function(resp){
  $("#property").load("<%= escape_javascript (render :partial => 'recipes/package_form') %>") 
   }
like image 545
Bibin Wilson Avatar asked Dec 12 '22 04:12

Bibin Wilson


2 Answers

Your problem is that you are trying to use render in assets, however, render is not available in assets

You should move your .js.erb file to an appropriate directory under app/views


Here are some other similar question:

  1. Rendering A Partial In Assets
  2. Rails JS ERB File Cannot Find Method Render
  3. When rendering a partial from tasks.js.coffee.erb - undefined, render
like image 114
RAJ Avatar answered Dec 29 '22 00:12

RAJ


Asset Pipeline

Firstly, you need to make sure that you don't use any Rails dynamic path helpers in your javascript directly.

The issue is that if you pre-compile your asset pipeline, you'll typically find these dynamic path helpers won't work correctly. Although there's nothing "wrong" with it - I tend to keep Rails back-end code completely separate from the front-end, as to ensure the versatility of the application:

#app/assets/javascripts/application.js
$(document).on("click", ".element", function(){
   $.ajax({  
     type: "GET",    
     url: "/cookbooks"
  });
});

This will send a "naked" Ajax request (no params / body) to your controller backend:

#app/controllers/cookbooks_controller.rb
Class CookbooksController < ApplicationController
   def index
      @cookbooks = Cookbook.all
      respond_to do |format|
        format.html
        format.js #-> loads /views/cookbooks/index.js.erb
      end
   end
end

The trick here is that you can now populate your index.js.erb file with the params necessary to render the partial:

#app/views/cookbooks/index.js.erb
$("#property").html("<%=j render :partial => 'recipes/package_form' %>") 

--

This should work for you

like image 26
Richard Peck Avatar answered Dec 29 '22 01:12

Richard Peck