Как стать автором
Обновить

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 мне кажется достаточным.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.