18. Bootstrap Modals

September 2015 · 2 minute read

Ensure all of the correct gems have been included into the app, the ones I’m using can be found in these locations:

https://github.com/bootstrap-ruby/rails-bootstrap-forms

https://github.com/twbs/bootstrap-sass

https://github.com/rails/turbolinks

1. Create a modal form to be rendered from the page you are on. In this, it’s going to be on the mybudget-show/home page because mybudget renders and controls the income partial.

<!-- Modal form -->
<div class="modal fade" id='new-income-modal-form' role='dialog'></div>
<!-- Modal form -->

2. Update the ‘new link’ in the partial view that will call the new modal

<!--<%= link_to 'Add Income', new_mybudget_income_path(@mybudget, @income) %>-->
 
<%= link_to new_mybudget_income_path(@mybudget, @income), remote: true, id: "new-item-link", class: "btn btn-sm btn-default round" do %> New
   
<%end%>

3. Create a new .js file under incomes which will be read by ‘Create’ in the incomes controller and direct to the appropriate partial view.

$("#new-income-modal-form").html("<%= j render('incomes/modal\_form\_new', income: @income) %>");
  
$('#new-income-modal-form').modal('show')

4. Create a new modal form partial which will be rendered in the modal form. It’s a good idea to make sure the new stuff works before destroying the old stuff.

<div class="modal-dialog reorder-modal-form">
  <div class="modal-content">
    <%= bootstrap_form_for([@mybudget, @income], remote: true) do |f| %></p> 
    
    <div class="modal-header">
      <h4 class="modal-title">
        New Income
      </h4></p>
    </div>
    
    <div class="modal-body">
      <table>
        <tr>
          <td class="field-name">
            <%= f.label :income %>
          </td>
          
          <td class="field">
            <%= f.text_field :income %>
          </td>
        </tr>
        
        <tr>
          <td class="field-name">
            <%= f.label :amount %>
          </td>
          
          <td class="field">
            <%= f.number_field :amount %>
          </td>
        </tr>
      </table>
    </div>
    
    <div class="modal-footer">
      <button type="button" class="btn btn-default" data-dismiss="modal" data-behaviour="form-clear">Cancel</button><br /> <%= f.submit class: "btn btn-primary", data: { trigger: 'loading' } %>
    </div>
    
    <% end %>
  </div>
</div>    

5. Lastly, in the incomes controller update the respond_to format in the create action, ensuring that it formats the new .js file we have just created.

def create
  @income = @mybudget.incomes.build(income_params)

  respond_to do |format|
    if @income.save
      format.html { redirect_to [@mybudget, @incomes], notice: 'income was successfully created.' }
      format.json { render :show, status: :created, location: @income }
      format.js {redirect_via_turbolinks_to [@mybudget, @incomes]}

6. Always remember to test it out. Run the server and see if it works correctly. There is now a button link under incomes.

Everything works and redirects back to the mybudget home page. These 6 steps can now be replicated anywhere that I would like a modal view to appear.

See the working example at

*Refs