четвер, 21 липня 2011 р.

Flash-повідомлення і Sinatra

Rails має приємний маленький хеш, який називається Flash. Це не супер герой, який може розвивати надзвукову швидкість і використовувати надлюдські рефлекси, а лише витончений спосіб тимчасового зберігання повідомлень між запити. Наприклад, якщо щось відбувається у вашому додатку (наприклад, зберігається), а потім користувач перенаправляється на іншу сторінку, то ви могли б зберігати повідомлення в Flash про те, що запис був збережений. Це повідомлення потім буде показане на наступній сторінці (після перенаправлення).

Офіційний FAQ по Sinatra рекомендує використовувати Rack::Flash, щоб отримати ту ж функціональність.
Один із розробників фреймворку Sinatra - Konstantin Haase у своєму twitter рекомендує використовувати Sinatra::Flash
If you're using it with Sinatra, switch from rack-flash to sinatra-flash
--http://twitter.com/konstantinhaase/status/92219479890726912

Про нього і піде мова нище.

Sinatra::Flash пропонує наступний набір функцій:
  • Простота (менше 50 рядків коду)
  • Докладна документація
  • Сумісність з API з Rails Flash, яким користується багато розробників
  • Кілька необов'язкових іменованих Flash-колекцій, кожна зі своїми хеш-повідомленням, так що різні вбудовані додатки можуть отримувати доступ до різних наборів повідомлень
  • HTML-помічник для відображення Flash-повідомлень

Все, що потрібно зробити, це встановити gem:
$ sudo gem install sinatra-flash

За приклад знову ж так візьмемо наш проект блогу із серії статей про Sinatra.
Все що вам потрібно зробити, це включити сесій і викликати бібліотеку Sinatra::Flash:
Додаємо наступні рядки на початку blog.rb:
require 'sinatra/flash'

enable :sessions

Вносимо зміни у метод для створення нового запису у файлі blog.rb:
# create
post "/posts" do
  @post = Post.create(:title => params[:title], :body => params[:body])
  if @post.save
    flash[:blah] = "Successfully create new post"
    redirect "/posts"
  else
    redirect "/posts/new"
  end
end

У представленні використовуємо помічник styled_flash, який здійснює перебір поточних Flash-повідомлень і виводить їх у HTML-стилі.
Редагуємо views/posts/index.haml:
#header
  %h1 Мій блог

=styled_flash

%a{:href => "posts/new"}> New Post
#content
  - @posts.each do |post|
    .container
      %h3= post.title
      %p= post.body
      %p= post.created_at

      %table
        %tr
          %td
            %a{:href => "posts/#{post.id}"}> Show
          %td
            %a{:href => "posts/#{post.id}/edit"}> Edit
          %td
            %form{:method => 'post', :action => "/posts/#{post.id}"}
              %input{:type => "hidden", :name => "_method", :value => "delete"}
              %input{:type=>'submit', :value => 'Destroy'}

HTML матиме наступний вигляд:
<div id='flash'>
  <div class='flash blah'>Successfully create new post</div>
</div><
Стилізація CSS для #flash id, the .flash class повністю залежить від вас.

Немає коментарів: