Ruby on Rails для занятых на примере блога

Предисловие

Не так давно я задался целью изучить фреймворк Ruby on Rails, почитал викиучебник по Ruby, затем принялся гуглить на тему Ruby on Rails, хотел найти хороший туториал для начинающих, но посложнее Hello World.
Нашел видео, где показывалось создание блога на Ruby on Rails, однако, версия, используемая там была стара (как, впрочем, и видео), и использовался скаффолдинг, не поддерживаемый уже в версии 2, что уж говорить по третью.
Но мне очень хотелось начать с такого туториала, так как я начинал разработку на CodeIgniter с создания простейшего блога.
К сожалению, для Ruby on Rails, для актуальной версии Rails я такого туториала не нашел, поэтому решил написать его сам.

Использую я ubuntu, rails версии 3. Ну что ж, приступим.

Начало

Создаем новый проект rails
$ mkdir rails
$ cd rails
$ rails new blog -d mysql
$ cd blog
$ bundle install


Нам отвечают что все создано успешно:
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.

После этого мы можем запустить сервер и наслаждаться дефолтной localhost:3000
$ rails server
image

image

теперь нам нужно указать конфигурацию database.yml
Для этого правим config/database.yml, где указываем пользователя и его пароль для связи с базой.

development:
 adapter: mysql2
 encoding: utf8
 reconnect: false
 database: blog_development
 pool: 5
 username: пользователь
 password: 'пароль'
 socket: /var/run/mysqld/mysqld.sock


Прочие базы аналогично. Сохраняем, закрываем, в консоли пишем:
$ rake db:create
Лезем в phpmyadmin, смотрим, появились наши базы.

Основы RoR

Теперь приступаем к созданию контроллера Blog:
$ rails g controller Blog
Появляется app/controllers/blog_controller.rb, его и правим, вставляя такой текст:
class BlogController < ApplicationController
 def index
 render:text => "Hello blog!"
 end
end

Теперь правим config/routes.rb, указывая наш контроллер:

match 'blog' => 'blog#index'


Идем по ссылке localhost:3000/blog и радуемся.
Теперь удаляем
render:text => "Hello blog!"
из app/controllers/blog_controller.rb и создадим app/views/blog/index.rhtml с таким содержанием:

<html>
<head></head>
<body>
 <p>hello blog (temlate!)</p>
</body>
</html>


Обновим в браузере localhost:3000/blog и увидим hello blog (template!).
Это мы так используем шаблоны. Теперь самое время передать значения из контроллера в шаблон. Для этого откроем blog_controller.rb и добавим туда такой код:
@var = 2 + 2

А в наше представление index.rhtml добавим

<p>
 2 + 2 is <%= @var %>
</p>


Обновим нашу страничку localhost:3000/blog и получим ожидаемый результат: 2 + 2 is 4
Логично. Стоит обратить внимание на то, что в представление мы вставляем значение переменной в теге
<%= %>
, где символ «=» означает, что мы что-то выводим. Если какой-то код будет выполняться, но результатов ждать не следует, то нужно использовать тег
<% %>

Теперь попробуем передать какое-то значение и произвести с ним действия.
Вместо 2 + 2 is
<%= @var %>
вставим хелпер формы:

<% form_tag(:controller => "blog", :action => "calc") do -%>
 <%= text_field_tag :val1%>
 <%= text_field_tag :val2%>
 <br />
 <%= submit_tag "Sum this" %>
<% end -%>


А в контроллер Blog вставим метод calc с таким кодом:

def calc
 if params[:val1] && params[:val2]
 @result = params[:val1].to_i + params[:val2].to_i
 end
end


Теперь нам нужно создать представление для метода calc. Создаем calc.rhtml в app/views/blog/ с таким содержанием:

<html>
<head></head>
<body>
 <p>Результат вычисления: <%= @result %> </p>
</body>
</html>

Главное, не забыть добавить верные маршруты в routes.rb:
match 'blog/calc' => 'blog#calc'


Обновляем, тестируем.
image
Как ни странно, все верно.
image
Вот и все основы Ruby on Rails. Приступим к созданию блога.

Создаем блог

Первое, что нам потребуется — таблица в БД с телом поста. Так как это версия для обучения, сойдет и примитивнейшее устройство таблицы. Автор, заголовок, тело поста — вот и все что нужно. Создадим модель:
$ rails g model Post
И выполним миграцию:
$ rake db:migrate
Отлично. Можно, конечно, сразу сгенерировать атрибуты как $ rails g model Post autor:string … и так далее, но мне больше нравится создать модель, а потом уже добавлять атрибуты в базе. Теперь, соответственно, добавляем атрибуты author, title и postbody в базу. Я это делаю в phpmyadmin, а Вы можете делать в том, что нравится.
image
Стоит отметить то, что в таблице уже есть поля — id, created_ad и updated_ad. Это автоматические поля, создаваемые rails.
Вставим пару строчек, чтобы не скучно было:
$ rails console

> s1 = Post.new
> s1.author = 'Вася Пупкин'
> s1.title = 'Первая запись'
> s1.postbody = 'Это текст самой первой записи, сделанный Василием Пупкиным.'
> s1.save


Нам отвечают true, и мы добавляем еще одну запись, чтобы первой было не так одиноко:

> s2 = Post.new
> s2.author = 'Иван Петров'
> s2.title = 'Бла бла'
> s2.postbody = 'Бла бла бла бла бла бла бла бла бла бла бла бла бла бла бла бла бла бла .'
> s2.save


На этом закончим:

> quit


Смотрим в базу: действительно, значения появились.
image
Выведем эти посты на главную. Для этого изменим код нашего контроллера Blog:

def index
 @pos = Post.order('id').reverse
end


И, index.rhtml тоже:

;<html>
<head></head>
<body>
 <h1>Here's blog: </h1>
 <hr />
 <% for post in @pos -%>
 <h3><%= post.title %></h3>
 <p>
 <%= post.postbody %>< br />< br />
 <i><small><%= post.author %> at <%= post.created_at %></small></i>
 </p>
 <hr />
 <% end %>
 </ body>
</html>


Обновив, увидим результаты своих стараний:
image

Теперь вернемся в наш контроллер, удалим метод calc, и добавим post, с таким кодом:

def post
 if params[:id]
 @post = Post.where('id = ?', params[:id])
 end
end


Создадим post.rhtml в каталоге представлений с таким содержанием:

<html>
<head></head>
<body>
 <h1>Here's post: </h1>
 <hr />
 <h3><%= @post.first.title %></h3>
 <p>
 <%= @post.first.postbody %><br /><br />
 <i><small><%= @post.first.author %> at <%= @post.first.created_at %></small></i>
 </p>
 <hr />
 </body>
</html>


И вместо ненужного
match 'blog/calc' => 'blog#calc'
вставим
match 'blog/post/:id' => 'blog#post#:id'

Еще изменим в index.rhtml строку
<h3><%= post.title %></h3>
на
<h3><a href = 'http://localhost:3000/blog/post/<%= post.id %>'><%= post.title %></a></h3>

Обновим, проходим по ссылкам, смотрим, радуемся.
Теперь нужно добавить возможность комментировать наши посты. Для этого создаем модель Comment:

$ rails g model Comment
$ rake db:migrate


Теперь добавим поля postid, bodycomment и name, где postid — это номер поста, bodycomment — тело комментария, а name — имя комментатора.
image
Теперь добавим форму комментирования и отображение комментариев в posts.rhtml:

<% form_tag(:controller => "blog", :action => "comment", :postid => @post.first.id) do -%>
 Имя: <br />
 <%= text_field_tag :name%>
 <br />
 Сообщение: <br />
 <%= text_field_tag :bodycomment%>
 <br />
 <%= submit_tag "Прокомментировать" %>
 <% end -%>
 <% if @comm != nil %>
 <% for com in @comm -%>
 <p>
 <b><%= com.name %><br /></b>
 <%= com.bodycomment %><br />
 <i><small>at <%= com.created_at %></small></i>
 </p>
 <% end %>
 <% end %>


И метод comment в контроллер Blog:

def comment
 if params[:postid] != nil && params[:name]!= nil && params[:bodycomment]!= nil 
 @co = Comment.new
 @co.postid = params[:postid]
 @co.name = params[:name]
 @co.bodycomment = params[:bodycomment]
 @co.save
 redirect_to :controller => 'blog', :action => 'post', :id => params[:postid]
 else
 redirect_to :controller => 'blog', :action => 'post'
 end
 end


Еще нужно добавить строчку в метод post контроллера Blog:

@comm = Comment.where('postid = ?', params[:id]).order('id').reverse


И в routes.rb:

match 'blog/comment/:postid' => 'blog#comment#postid'


Тестируем: все работает.
image
Теперь нужно создавать посты. Делается это так же, как комментарии.
Создаем метод create в Blog:

def create
 if params[:author] != nil && params[:postbody] != nil && params[:title] != nil
 @po = Post.new
 @po.author = params[:author]
 @po.postbody = params[:postbody]
 @po.title = params[:title]
 @po.save
 redirect_to :controller => 'blog', :action => 'index'
 end
 end


И немного добавляем кода в index.rhtml

<% form_tag(:controller => 'blog', :action => 'create') do -%>
 Имя: <br />
 <%= text_field_tag :author %><br />
 Тема: <br />
 <%= text_field_tag :title %>
 <br />
 Пост: <br />
 <%= text_field_tag :postbody %>
 <br />
 <%= submit_tag 'Создать пост' %>
 <% end -%> 


Главное, это не забыть про routes.rb:

match 'blog/create' => 'blog#create'


Тестируем:
image
Все работает так, как должно работать.

Заключение

На этом создание примитивного блога окончено. Можно еще много чего прикручивать, однако, чтобы понять принципы разработки на Ruby on Rails мне кажется достаточным.


1 комментарий

комментарий был удален
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.