Reputation: 489
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
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>×</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