current_user works by storing id of current user in the application session. Most commonly session is stored in cookies. Whether or not the cookies survive browser restart depends on client's browser settings.
Devise is a well known solution for authentication in Rails applications. It's full featured (it not only adds authentication but also password recovery, email changing, session timeout, locking, ip tracking, etc.) and can be expanded to add even more (like JWT authentication).
Devise is the cornerstone gem for Ruby on Rails authentication. With Devise, creating a User that can log in and out of your application is so simple because Devise takes care of all the controllers necessary for user creation ( users_controller ) and for user sessions ( users_sessions_controller ).
As Andres says, the form calls helpers which are specified by Devise and so aren't present when you access a Devise form from a non-Devise controller.
To get around this, you need to add the following methods to the helper class of the controller you wish to display the form under. Alternatively, you can just add them to your application helper to make them available anywhere.
def resource_name
:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
Source: http://pupeno.com/blog/show-a-devise-log-in-form-in-another-page/
Can try this also...check this question.
Source
<%= form_for("user", :url => user_session_path) do |f| %>
<%= f.text_field :email %>
<%= f.password_field :password %>
<%= f.check_box :remember_me %>
<%= f.label :remember_me %>
<%= f.submit 'Sign in' %>
<%= link_to "Forgot your password?", new_password_path('user') %>
<% end %>
The form you created works when rendered from a Devise controller because "resource" is defined through Devise. Take a look at the implementation of the Devise SessionsController - from what I understand, you're attempting to replicate the "new" action. The method "build_resource" is probably what you're looking after.
The Warden gem is where the "resource" objects are coming from. If you wish to dig deeper, that'd be the place to look.
To refine on the accepted answer, we use this helper to allow different types of resources:
def resource_name
@resource_name ||= if admin_controller?
:admin_user
else
:user
end
end
def resource
@resource ||= resource_name.to_s.classify.constantize.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[resource_name]
end
where admin_controller?
is something we have from before in the ApplicationController
to handle login redirects:
def admin_controller?
!devise_controller? and request.path =~ /^\/admin/
end
helper_method :admin_controller?
I was getting the same error undefined local variable or method "resource"
you describe from one of my controllers, because my controller base class was missing the following (Rails-API ActionController::API was at fault):
include ActionController::Helpers
Thus the helper methods from Devise could not be resolved in the view.
To make Devise work with Rails-API I needed to include:
class ApplicationController < ActionController::API
include AbstractController::Rendering
include AbstractController::Layouts
include ActionController::MimeResponds
include AbstractController::Translation
include ActionController::ImplicitRender
include ActionController::Helpers
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With