class DeviseController
All Devise controllers are inherited from here.
def _prefixes #:nodoc:
itself. Changing its visibility may break other gems.
This method should be public as it is in ActionPack
loaded before even having a request object.
Action Controller tests that forces _prefixes to be
Notice we need to check for the request due to a bug in
Override prefixes to consider the scoped view.
def _prefixes #:nodoc: @_prefixes ||= if self.class.scoped_views? && request && devise_mapping ["#{devise_mapping.scoped_path}/#{controller_name}"] + super else super end end
def assert_is_devise_resource! #:nodoc:
Checks whether it's a devise mapped resource or not.
def assert_is_devise_resource! #:nodoc: unknown_action! <<-MESSAGE unless devise_mapping uld not find devise mapping for path #{request.fullpath.inspect}. is may happen for two reasons: You forgot to wrap your route inside the scope block. For example: devise_scope :user do get "/some/route" => "some_devise_controller" end You are testing a Devise controller bypassing the router. If so, you can explicitly tell Devise which mapping to use: @request.env["devise.mapping"] = Devise.mappings[:user] SSAGE end
def clean_up_passwords(object)
def clean_up_passwords(object) object.clean_up_passwords if object.respond_to?(:clean_up_passwords) end
def devise_i18n_options(options)
def devise_i18n_options(options) options end
def devise_mapping
def devise_mapping @devise_mapping ||= request.env["devise.mapping"] end
def find_message(kind, options = {})
def find_message(kind, options = {}) options[:scope] ||= translation_scope options[:default] = Array(options[:default]).unshift(kind.to_sym) options[:resource_name] = resource_name options = devise_i18n_options(options) I18n.t("#{options[:resource_name]}.#{kind}", **options) end
def navigational_formats
def navigational_formats @navigational_formats ||= Devise.navigational_formats.select { |format| Mime::EXTENSION_LOOKUP[format.to_s] } end
def require_no_authentication
Example:
Helper for use in before_actions where no authentication is required.
def require_no_authentication assert_is_devise_resource! return unless is_navigational_format? no_input = devise_mapping.no_input_strategies authenticated = if no_input.present? args = no_input.dup.push scope: resource_name warden.authenticate?(*args) else warden.authenticated?(resource_name) end if authenticated && resource = warden.user(resource_name) set_flash_message(:alert, 'already_authenticated', scope: 'devise.failure') redirect_to after_sign_in_path_for(resource) end end
def resource
def resource instance_variable_get(:"@#{resource_name}") end
def resource=(new_resource)
def resource=(new_resource) instance_variable_set(:"@#{resource_name}", new_resource) end
def resource_class
def resource_class devise_mapping.to end
def resource_name
def resource_name devise_mapping.name end
def resource_params
def resource_params params.fetch(resource_name, {}) end
def respond_with_navigational(*args, &block)
def respond_with_navigational(*args, &block) respond_with(*args) do |format| format.any(*navigational_formats, &block) end end
def set_flash_message(key, kind, options = {})
Please refer to README or en.yml locale file to check what messages are
#resource_scope_messages
user:
#default_scope_messages - only if resource_scope is not found
passwords:
devise:
en:
Example (i18n locale file):
next action).
the flash message will be available to the current action instead of the
value to populate the flash.now hash in lieu of the default flash hash (so
found we look to the default scope. Set the "now" options key to a true
to set up your messages using specific resource scope, and if no message is
Sets the flash message with :key, using I18n. By default you are able
def set_flash_message(key, kind, options = {}) message = find_message(kind, options) if options[:now] flash.now[key] = message if message.present? else flash[key] = message if message.present? end end
def set_flash_message!(key, kind, options = {})
def set_flash_message!(key, kind, options = {}) if is_flashing_format? set_flash_message(key, kind, options) end end
def set_minimum_password_length
def set_minimum_password_length if devise_mapping.validatable? @minimum_password_length = resource_class.password_length.min end end
def signed_in_resource
def signed_in_resource warden.authenticate(scope: resource_name) end
def successfully_sent?(resource)
If we are in paranoid mode, we always act as if the resource was valid
Helper for use after calling send_*_instructions methods on a resource.
def successfully_sent?(resource) notice = if Devise.paranoid resource.errors.clear :send_paranoid_instructions elsif resource.errors.empty? :send_instructions end if notice set_flash_message! :notice, notice true end end
def translation_scope
method so that other controllers inheriting from them would use
Controllers inheriting DeviseController are advised to override this
def translation_scope "devise.#{controller_name}" end
def unknown_action!(msg)
def unknown_action!(msg) logger.debug "[Devise] #{msg}" if logger raise AbstractController::ActionNotFound, msg end