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
теперь нам нужно указать конфигурацию 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'
Обновляем, тестируем.
Как ни странно, все верно.
Вот и все основы Ruby on Rails. Приступим к созданию блога.
Создаем блог
Первое, что нам потребуется — таблица в БД с телом поста. Так как это версия для обучения, сойдет и примитивнейшее устройство таблицы. Автор, заголовок, тело поста — вот и все что нужно. Создадим модель:$ rails g model Post
И выполним миграцию:
$ rake db:migrate
Отлично. Можно, конечно, сразу сгенерировать атрибуты как $ rails g model Post autor:string … и так далее, но мне больше нравится создать модель, а потом уже добавлять атрибуты в базе. Теперь, соответственно, добавляем атрибуты author, title и postbody в базу. Я это делаю в phpmyadmin, а Вы можете делать в том, что нравится.
Стоит отметить то, что в таблице уже есть поля — 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
Смотрим в базу: действительно, значения появились.
Выведем эти посты на главную. Для этого изменим код нашего контроллера 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>
Обновив, увидим результаты своих стараний:
Теперь вернемся в наш контроллер, удалим метод 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 — имя комментатора.
Теперь добавим форму комментирования и отображение комментариев в 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'
Тестируем: все работает.
Теперь нужно создавать посты. Делается это так же, как комментарии.
Создаем метод 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'
Тестируем:
Все работает так, как должно работать.
Заключение
На этом создание примитивного блога окончено. Можно еще много чего прикручивать, однако, чтобы понять принципы разработки на Ruby on Rails мне кажется достаточным.
1 комментарий