Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to render a RAILS partial with local variable f in new.js.erb?

There is a way to render a erb page in js.erb like this with :remote => true in rails:

$('#invoice_against_lease').html('$("<%= j render(:file => 'invoice/new.html.erb') %>")');

We have a partial _customer_quote_record like this:

   <%= f.input :quote_id, :label => 'Quote#:', :collection => quotes_for_invoice(@customer), :include_blank => true %>
   <%= f.hidden_field :_destroy %>  

The partial is rendered in html.erb as this, with passing local variable builder:

<%= f.simple_fields_for :invoice_items do |builder| %>
  <%= render 'customer_quote_record', :f => builder %>
<% end %>

Tried the code below:

$('#invoice_against_lease').html('$("<%= j render(:file => 'customer_lease_record', :f => f) %>")');

And the error is "ActionView::Template::Error (undefined local variable or methodf'..."`

Is there a way to render the partial above in js.erb?

like image 486
user938363 Avatar asked Jul 27 '12 16:07

user938363


3 Answers

Try the following:

$('#invoice_against_lease').html('$("<%= j render(:partial => 'customer_lease_record', :locals => {:f => f}) %>")');

This of course assumes that f is defined wherever you make this call. If it's different, just change :locals => {:f => f} to :locals => {:f => "YOUR_VARIALBE"}

like image 60
Naty722 Avatar answered Nov 15 '22 14:11

Naty722


Another way to do it:

<%=j render "invoice/new", f: f %>

like image 40
MatayoshiMariano Avatar answered Nov 15 '22 14:11

MatayoshiMariano


Look at this, I found a solution:

in js.rjs file, I repdroduce the form_for and fields_for helper, and save the fields_for constructor in a instance variable @builder, and then I pass it to the partial (locals: {f: @builder...)

js.rjs:

<%
  @expense=Expense.new
  [email protected]_details.build
  form_for(@expense) do |f| 
    f.fields_for(:expense_details,new_expense_detail,:child_index=>@child_index) do |builder| 
      @builder=builder # <<--- New line compared js.rjs
    end
  end
%>

$("#cost_center_group_<%=@child_index%>").html("<%= escape_javascript(render(partial: 'select_costcenter', locals: {f: @builder,child_index: @child_index}))%>");
like image 29
Albert Català Avatar answered Nov 15 '22 14:11

Albert Català