Last modified: Mon Aug 28 2017 23:05:49 GMT+0800 (Malay Peninsula Standard Time)

Chapter 5. Adding User to Any Table

In the previous chapter, we created a simple car reservation system. However, the bookings are useless if they are not associated with any user. In order make sure the booking is assigned to the logged in user, we have to modify the model and controller. You may use the similar concept to apply it to any model and controller.

5.1 Adding User Association

To begin, let’s add a user_id column in our Booking model. Figure 5.1.1 shows the code in Table 5.1.1 is added to Line 8.

Table 5.1.1: Code to add to DB

#MyApp/app/db/migrate/YYYYMMDDHHMMSS_create_bookings.rb

t.belongs_to :user, foreign_key: true

The code in Table 5.1.1 is saying that we are adding a column that have a foreign key that belongs to my User model. If you name your User model differently, you have to rename :user to your respective model. YYYYMMDDHHMMSS is the date and time of the file is created.


Figure 5.1.1: Code to add to Booking Table, Line 8

Add the following code in Table 5.1.2 to file respective file. Figure 5.1.2 shows the result of the operation shown in Table 5.1.2. operation is shown below.

Table 5.1.2: Code to add to Controller

#MyApp/app/controllers/bookings_controller.rb

#add after permit
.merge(user_id: current_user.id)


Figure 5.1.2: Code to add to Controller, Line 16

You may not have current_user.id defined if you are not using Devise Gem. Please follow the next section, Chapter 5.2, or skip the section if you have it defined. If you are getting an error saying that current_user is not defined, you have to add to follow the instruction in Chapter 5.2.

Delete your development.sqlite3 and migrate your database once you are done modifying the file. You may have to turn off your rails server and SQLiteStudio if you have it opened before deleting development.sqlite3

5.2 The Famous current_user

You may have seen a lot of tutorials online and wonders why people are using current_user and where does it actually come from. If you are using devise Gem to model your User, current_user is already built in in the Gem. What if you are not using the devise Gem and still want to have the ability to use the method? In this case, we have to add the method manually. Follow the instruction in Table 5.2.1.

Table 5.2.1: Code to add to Controller

#MyApp/app/controllers/application_controller.rb

class ApplicationController < ActionController::Base  
  helper_method :current_user  
  def current_user  
    return unless session[:user_id]  
    @current_user ||= User.find(session[:user_id])  
  end  
end

I have not tested the code In Table 5.2.1 in my Application since I have my User model generated by Devise gem. However, I have used this code earlier. In order for the code to function properly, you have to have a user logged it when current_user.

5.3 More Testing and Function Verification

Since we added a new column to the User model, we have to delete the development.sqlite3 so that we can migrate the database and rebuild the table. In order to delete the file, you may have to close your SQLiteStudio and your Rails server. Now, start your server and create your booking with a logged in user.

Figure 5.3.1 shows the newly rebuild database with user_id field and the user_id is recorded and stored in the database when a booking is created by the user. user_id filled will be filled in automatically as we have a current_user declared in Application Controller (more like a global method) and can be used in any controller. The method, current_user.id, will return the current logged in user ID.


Figure 5.3.1: Booking is now associate to currently logged in user

results matching ""

    No results matching ""