Professional Documents
Culture Documents
With Ajax
Frameworks, like Rails, help to achieve this; why?… here are some of the reasons:
• The second part of this tutorial: A Simple Twitter App with Ruby on Rails –
User Authentication
• The third part of this tutorial: A Simple Twitter App with Ruby on Rails –
Building Friendships
This is used to reduce the amount of up-front configuartion. The idea is; if you
abide by certain coding conventions, you will have little, to none, configuration
to do.
ORM reducing coupling to the database. This abstraction allows you changed
the DBMS provider with little trouble.
• Structured Code:
The MVC pattern forces you to organise your code in a clean, structured way.
This results in more maintainable code.
• Plugins:
Plugins save you from re-inventing the wheel every time you want to add
functionality to your app. For instance, making you web app capable of
performing searches can be easily added with the acts_as_ferret plugin. There
are many more plugins!
In the first part of this three part series, we cover setting up a simple message model,
which will hold the messages posted. Further to this, we will learn how to post a
message asynchronously, using AJAX.
Ok, so you’ve decided to create a “twitter” style micro-blog using Ruby on Rails. First,
we need to think about our basic requirements and from this we can model our
application.
There are many ways that this can be done, but we will use a simple technique in which
you jot down a few paragraphs about how and what the application is expected to do
then highlight the nouns. So, lets try it.
My web app should work in a similar way to twitter. Users should be able to register
with the site and create short posts. Users should be able to follow other users. Each
user should be able to see their own posts plus the users they are following.
Note that I’ve been selective in what nouns I’ve highlighted. You only really need to
take notice of the nouns which you feel will need to store data to the database.
I know there is more to twitter than this, but lets leave it simple. As you can see the
“nouns”, which will need to store data to the database are “posts” and “users”. So we
require two models:
In the first part of the tutorial, we are going to deal with posts only.
• Post
• User
Before we do anything we need to create a project for our twitter web app.
As you can see, I will be using MySQL as the DBMS, however, feel free to use
whatever database you want.
Open the database.yml file in the config folder and modify the password as required. An
example is shown below.
1. development:
2. adapter: mysql
3. encoding: utf8
4. database: twittest_development
5. pool: 5
6. username: root
7. password: yourpassword
8. host: localhost
So let’s go right ahead and generate the “Post” model and migrate it.
Controller
We need to set up some methods for interacting with the model. Edit your
“posts_controller.rb” file and add the following methods:
We only need two methods, “index” and “create”. The index method creates an instance
variable containing all the posts in descending order. The create method is used to
create a new post.
Views
Let’s create the “index” view. First, we’ll create a partial for posts. Create a file called
“_post.html.erb” in the views/posts folder and add the code below.
The index view is now very simple. Create a file called “index.html.erb” in the
views/posts folder and add the code below.
Open a console session and create a few new messages, as shown below.
Obviously you’re not going to get the user to use the console to create messages. So,
our next task is to inject some functionality into our web app to allow the user to create
messages. Twitter has an input box above the indexed messages, which is used for
submitting a new message; We will keep our web app the same.
First, we will create a partial for the form, then we will render that partial at the top of
the index view. Create a file called “_message_form.html.erb” in the posts view folder
and add the following code:
Now, we need to modify the index view to render this partial at the top. Open the
index.html.erb file and modify the code as follows:
For this to work we need to make one last modification. Open the route.rb file and map
a new “posts” resource, as shown below. (Note: the comments from this file have been
removed).
1. ActionController::Routing::Routes.draw do |map|
2. map.resources :posts
3. map.connect ':controller/:action/:id'
4. map.connect ':controller/:action/:id.:format'
5. end
This creates a few named routes. If you look back to the “create” method in the posts
controller, you’ll see that we make use of the posts_path named route; Defining the
posts resource makes this named route available.
So, lets fire up the web server and a see how things look.
AJAX allows you to make asynchronous requests to the server using JavaScript. We
will make use of AJAX to make the posting a message a bit smoother.
When the user clicks on the “Update” button, we want the message to update without
refreshing the browser. We have a few things to do to add AJAX functionality. First,
lets change the “create” method in the posts controller:
1. def create
2. @post = Post.create(:message => params[:message])
3. respond_to do |format|
4. if @post.save
5. format.html { redirect_to posts_path }
6. format.js
7. else
8. flash[:notice] = "Message failed to save."
9. format.html { redirect_to posts_path }
10. end
11. end
12. end
The only change here is the “format.js” code, allowing the create method to respond to
JavaScript. Next, we need to create a posts layout file. In the views/layout folder create
a file called “posts.html.erb” and add the following code:
The main purpose of this is to make use of the “javascript_include_tag” call, which
includes the relevant JavaScript files for AJAX and some visual effects. Next, we need
to make a small addition to the index view (“index.html.erb”).
As you can see all we have added is a div block surrounding the posts partial. This will
be used later when we are specifying where the AJAX response should be placed.
Nearly there! Now we will add a div_for block to our post partial (“_post.html.erb”).
The div_for operation create a div block with a unique id, this is especially useful when
looping through several records. Finally, we need to create the rjs template. To do this,
create a file called “create.js.rjs” in the views/posts folder and add the following code.
That’s it! Start you web server again, browse to http://localhost:3000/posts and give it a
go.
I’ve created a stylesheet, which we can use to make things look a bit more respectful.
Create a file called layout.css in the public/stylesheets folder then add the following
CSS code:
1. body
2. {
3. font-family: tahoma, sans-serif;
4. font-size: 18px;
5. background-color: #4B7399;
6. width: 100%;
7. color: #ffffff;
8. margin: 0;
9. text-align: center;
10. }
11.
12. #content
13. {
14. width: 800px;
15. margin: 0 auto;
16. text-align: left;
17. }
18.
19. .post
20. {
21. padding: 5px 20px 5px 20px;
22. background-color: #ffffff;
23. margin: 20px 0 20px 0;
24. color: #000000;
25. }
Finally, you will need to add stylesheet_link_tag call to the posts.html.erb layout file.
As per below, the call should be placed in the head tag.
1. <head>
2. <%= javascript_include_tag :all %>
3. <b><%= stylesheet_link_tag 'layout' %></b>
4. </head>
OK! It doesn’t look that pretty, but it will do for our purposes.
To have the root URL (http://localhost:3000) direct the user towards your posts you will
first need to delete the public/index.html file. Do this now.
The second thing you need to do is set up a route in your config\routes.rb file. Open
routes.rb in notepad and add a new line to the end using map.root, as shown below.
1. ActionController::Routing::Routes.draw do |map|
2. map.resources :posts
3. map.connect ':controller/:action/:id'
4. map.connect ':controller/:action/:id.:format'
5. map.root :controller => "posts"
6. end
Now if you browse to http://localhost:3000. The request will be routed to the posts
controller.
Summary
This concludes the first part of the series. Depending on the popularity of this article,
parts 2 and 3 will follow shortly.