Reputation: 1943
I want to use modal window with sign-in(and sign-up, etc..) view in devise gem. But I couldn't access this view.
How can I configure devise gem controller to use modal?
Upvotes: 0
Views: 456
Reputation: 4226
Although Devise allows controller configuration, the presentational aspect of signing in via modal is more properly handled within the view.
By default, Devise's views are packaged within the gem. To access the view templates, you can run the following command:
rails generate devise:views
Running the above generator will copy all of Devise's view templates in the app/views/devise
directory, allowing you to modify the markup as necessary.
More details on configuring views can be found in Devise's documentation.
Hope it helps!
Upvotes: 1
Reputation: 1961
You just need to override Devise controllers, for instance:
Controller (controllers/registrations_controller.rb)
class RegistrationsController < Devise::RegistrationsController
# POST /resource
def create
build_resource(sign_up_params)
resource.save
yield resource if block_given?
if resource.persisted?
if resource.active_for_authentication?
set_flash_message :notice, :signed_up if is_flashing_format?
sign_up(resource_name, resource)
respond_with resource, location: after_sign_up_path_for(resource)
else
set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format?
expire_data_after_sign_in!
respond_with resource, location: after_inactive_sign_up_path_for(resource)
end
else
clean_up_passwords resource
set_minimum_password_length
respond_with resource
end
end
protected
# Signs in a user on sign up. You can overwrite this method in your own
# RegistrationsController.
def sign_up(resource_name, resource)
sign_in(resource_name, resource)
end
# The path used after sign up. You need to overwrite this method
# in your own RegistrationsController.
def after_sign_up_path_for(resource)
after_sign_in_path_for(resource)
end
# The path used after sign up for inactive accounts. You need to overwrite
# this method in your own RegistrationsController.
def after_inactive_sign_up_path_for(resource)
scope = Devise::Mapping.find_scope!(resource)
router_name = Devise.mappings[scope].router_name
context = router_name ? send(router_name) : self
context.respond_to?(:root_path) ? context.root_path : "/"
end
# The default url to be used after updating a resource. You need to overwrite
# this method in your own RegistrationsController.
def after_update_path_for(resource)
signed_in_root_path(resource)
end
# Authenticates the current scope and gets the current resource from the session.
def authenticate_scope!
send(:"authenticate_#{resource_name}!", force: true)
self.resource = send(:"current_#{resource_name}")
end
def sign_up_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
def account_update_params
devise_parameter_sanitizer.sanitize(:account_update)
end
def translation_scope
'devise.registrations'
end
end
Helper (helpers/registrations_helper.rb)
module RegistrationsHelper
def resource_name
:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
end
Route (routes.rb)
devise_for :users, :controllers => { :registrations => 'registrations' }
Modal (views/users/_new_user.html.erb)
<div class="modal fade" id="form-validation-modal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<%= form_for( resource,
:as => resource_name,
:url => user_registration_path(resource),
:html => {:id => "sign_up_user"} ) do |f| %>
<%= devise_error_messages! %>
<div class="modal-header">
<h4 class="modal-title" id="myModalLabel">
Create a new user
</h4>
</div>
<div class="modal-body">
<div class="form-group">
<%= render 'shared/error_messages' %>
<%= f.label :name, "Name:"%>
<%= f.text_field :name, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :email, "Email:"%>
<%= f.email_field :email, class: "form-control" %>
</div>
</div>
<div class="modal-footer">
<button id="dismiss" type="button" class="btn btn-default" data-dismiss="modal" style="float:left">Cancel</button>
<%= f.submit "Save user", class: "btn btn-success btn-medium", style: "float:right" %>
</div>
<% end %>
</div>
</div>
</div>
Upvotes: 0