How to render a RAILS partial with local variable

2020-02-28 18:46发布

问题:

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?

回答1:

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"}



回答2:

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
  new_expense_detail=@expense.expense_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}))%>");


回答3:

Another way to do it:

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