Rails Auth and 1-M

Objectives

  • Create users and store their passwords securely

  • Enable the ability to authenticate users and store sessions once logged in

  • Utilize filters and validations in Rails

  • Establish 1:M relationships

Remember all that hassle of setting up authentication in Node? Rails makes it easy.

Create a new project

You should know how to do this now. If not, see notes from Intro to Rails.

Create a user model

We need to first start creating a user model that has a username/email field and a password_digest. Note that you have to name the field this.

rails g model user email password_digest
rake db:migrate

Add some validations

http://guides.rubyonrails.org/active_record_validations.html

app/models/user.rb

Note that we're only checking for presence and uniqueness of the email. Use this gem if you'd like to actually validate the email address contents.

Add password hashing

  • Add has_secure_password to the user model

  • uncomment gem 'bcrypt' on your Gemfile and run the bundler

Test out a user

Now that we have has_secure_password, Rails gives out a password setter.

Add Validations for User

Let's test a real user

This is nifty, but long. We can add a class method that will return true or false, based on the params from the controller.

Add a helper method to the class

The finished User model

Add the login pages

Let's create a session controller to handle logging in/out. We'll organize this by calling the controller sessions, because in reality, we're creating and destroying sessions on login and logout.

add actions create and destroy

Lets create some routes

Lets generate a form

Wait, why are we using the symbol? See this StackOverflow answer

Authenticate

Authenticate the user on sessions#create

Add current User capabilities

Adding Flash Messages

The flash hash is accessible in every Rails controller and view. To access it, we'll need a way to iterate through the hash and print out the keys and values. The best way is to create a partial and include it on the layout (so it'll be on every page).

Partials have to start with an underscore in Rails. We can render the partial by using the render helper.

With a partial at app/views/partials/_flash.html.erb

_flash.html.erb

Protect a controller

before_action :is_authenticated on the controller you want to protect

@current_user is now visible to all pages because the current_user function is invoked

Adding 1:M relationships with another model

Let's first add another model to relate to the user. In order for the user to have many pets, we can create the model by including the model name and references as the type.

This will make the following migration, which will include a userId in the pet model.

Then, make sure to migrate and include the associations in each model.

models/user.rb

models/pet.rb

Now try testing in the Rails console

Last updated

Was this helpful?