techquestion
techquestion

Reputation: 489

Render page with new form in modal instead of new page in Ruby on Rails/JS

I am unable to render a (bootstrap) modal instead of rendering the classic new.html.erb, used to to create a new room.

Given the fact that I am new to JS and modals, I have the feeling I am lacking understanding regarding some of the fundamental concepts needed to properly read/understand content on this topic online and subsequently fix my issue. Therefore, I was wondering if someone could help me to better understand what is happening (and not happening) in my code when creating a modal.

Really sorry for creating such a length question, but I don't know how else to explain it as I am not sure where to look at/the mistake is (this even includes the folder mapping).

assets/javascripts/application.js

//= require jquery
//= require popper
//= require bootstrap
//= require_tree .

gemfile

gem 'bootstrap'
gem 'popper_js'
gem 'jquery-rails'

models

class Room < ApplicationRecord
  belongs_to :hotel
end

class Hotel < ApplicationRecord
  has_many :rooms, dependent: :destroy
end

controller

class RoomsController < ApplicationController

  def new
    respond_to do |format|
      format.html
      format.js
    end
    @hotel = Hotel.find(params[:hotel_id])
    @room = Room.new
    authorize @room
  end

  def create
    @room = Room.new(room_params)
    @hotel = Hotel.find(params[:hotel_id])
    @room.hotel = @hotel
    authorize @room

    #redirect to index page
    if @room.save
      redirect_to hotel_rooms_path(@hotel)
    else
      render :new
    end
  end

views/rooms/index.html.erb

<%= render "partials/show_panel_rooms_overview"%>

Below my code rendering with link_to refering to the traditional new view of Rails (working)

views/partials/_show_panel_rooms_overview.html.erb

<%= link_to "add new room", new_hotel_room_path, class: "new-room-btn" %>

views/rooms/new.html.erb

<%= render 'room_new_form', hotel: @hotel%>

views/rooms/_room_new_form.html.erb

<%= simple_form_for [@hotel, @room] do |f|%>
    <%= f.input :name %>
    <%= f.button :submit %>
<% end %>

And below the code for modals (not working)

(i) model + (ii) controller is the same as above

views/partials/_show_panel_rooms_overview.html.erb

<%= link_to "add new room", new_hotel_room_path,  {:remote => true, 'data-toggle' =>  "modal", 'data-target' => '#modal-window'}  %>
<div id="modal-window" class="modal hide fade" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"></div>

views/rooms/new.html.erb

<div class="modal-header">
   <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
   <h3 id="myModalLabel">Modal header</h3>
 </div>
 <div class="modal-body">

<%= render 'room_new_form', hotel: @hotel%>

 </div>
 <div class="modal-footer">
   <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
   <button class="btn btn-primary">Save changes</button>
 </div>

views/rooms/_room_new_form.html.erb

<%= simple_form_for [@hotel, @room] do |f|%>
    <%= f.input :name %>
    <%= f.button :submit %>
<% end %>

views/rooms/_new.js.erb

$("#modal-window").html("<%= escape_javascript(render 'rooms/new') %>");

Upvotes: 2

Views: 1437

Answers (1)

techquestion
techquestion

Reputation: 489

For people looking at my question, in case you might find it interesting, I came one step further (e.g. next error). The key to render the new form, is to use new.js.erb and consequently refer to a partial and not new.html.erb. Please let me know, if you have any further input on my current error message/code.

views/partials/_show_panel_rooms_overview.html.erb

<%= link_to "New", new_hotel_room_path, remote: true, class: "btn btn-success pull-right new" %>

views/rooms/new.js.erb

 $("#newModal .modal-content").html('<%= j render "rooms/room_new_form" %>');
  $("#newModal").modal();

views/rooms/_room_new_form.html.erb

<div class="modal-header">
  <button type="button" class="close" data-dismiss="modal"><span>&times;</span></button>
  <h4 class="modal-title">New Item</h4>
</div>
<div class="modal-body">
<%= simple_form_for [@hotel, @room] do |f|%>
    <%= f.input :name %>
    <%= f.button :submit %>
<% end %>
</div>

This provides me with a new (yay) error:

The view is rendered according to my terminal, but nothing is showing:

Rendering rooms/new.js.erb
  Rendered rooms/_rooms_new_form.html.erb (9.2ms)
  Rendered rooms/new.js.erb (13.2ms)
Completed 200 OK in 35ms (Views: 28.4ms | ActiveRecord: 0.4ms)

Upvotes: 1

Related Questions