n8o
n8o

Reputation: 1943

rails, devise gem - How can I configure devise controller?

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

Answers (2)

Zoran
Zoran

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

Jorge André Pereira
Jorge André Pereira

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

Related Questions