Tower of Babel Hints
ERD
My ERD ended up looking like the below.
Show ERD
Steps for setting up the CRUD infrastructure
- Generate user accounts.
- Generate chat resources.
- Force users to sign in before they can do anything else.
- Modify the generated chat resource code to automatically associate a chat with the signed in user.
- Use the
Language
seed data to create a dropdown in the new chat form.
- There’s a helper method in actions and view templates that you can use to find out the URL of the current request:
request.original_url
(to display the share link).
- Whenever a visitor arrives at a chat details page:
- Check whether we know this visitor or not (look in their browser cookies).
- If not,
- Create a new record in a table to keep track of them. I called this table
Speaker
.
- Default their name to “Guest” (unless they happen to be a signed in
User
, then set their name to their name).
- Default their language to the chat’s default language (unless they happen to be a signed in
User
, then set their language to English).
- Save them.
- Set a cookie with their newly assigned ID number in this table.
- If so,
- Make a form on the chat details page to allow speakers to modify their display name and language.
- Make a form on the chat details page to allow speakers to add messages to the chat.
- Display the list of messages associated with a chat on the details page, along with the speaker’s name, in ascending order that they were
created_at
.
- There is a view helper method called
simple_format
that will do basic formatting of long pieces of text
, like adding line breaks.
The crux of it
Now that you have the basic CRUD of the application working, the crux of the application:
- Create a table to store translations of each message. I called mine
Translation
, with a message_id
, language_id
, and body
.
- As you are looping through the messages for a chat to display them on the details page, for each message:
- Look up the translation of the message in the current speaker’s language.
- If it is not
nil
,
- If it is
nil
,
- Translate it with the Google Translate API and save it.
- Then display it.
Magical.