How to rename a file with file_column plugin.
Собственно, понадобилось… Время от времени изменять имя файла, загруженного с помощью file_column. Например так: stylesheet.css → stylesheet_1399194798.css.
Вот, что получилось.
Читать дальше »How to rename a file with file_column plugin.
Собственно, понадобилось… Время от времени изменять имя файла, загруженного с помощью file_column. Например так: stylesheet.css → stylesheet_1399194798.css.
Вот, что получилось.
Читать дальше »
Случается, что число чертей или других сущностей (и не обязательно – зловредных) переваливает далеко за 1000+. В моем случае это было количество товаров в тестовом приложении. Ровно 40305. Отобразить такое большое число на странице, не поломав при этом верстку, бывает довольно проблематично. Поэтому я сегодня добавил пару методов для сокращения размера оного.

Проект TurnKey Linux представил подборку из 40 готовых минималистичных сборок Ubuntu 8.04.3 LTS для быстрого развертывания в Cloud-окружениях Amazon EC2 или для использования в качестве гостевых ОС в системах виртуализации VMware, Xen HVM, KVM или VirtualBox.
И в частности, – полностью работоспособную сборку с Ruby on Rails. Которая помимо стандартного ядра TurnKey, включает в себя следующее:
Сборка представлена в виде VM (221MB) и ISO-образа (195MB).
Узнал на OpenNews.

Практически каждый разработчик имеет собственные предпочтения в выборе сторонних компонентов и библиотек, используемых в приложении. Не так давно мне попался такой топ-лист плагинов и gem-ов для разработки на Ruby on Rails.
Существует множество плагинов, которые мы используем для специальных нужд, как то генерирование PDF или обработка вложений (attachment). Однако это список наших избранных плагинов, которые мы используем практически в каждом проекте.
Это был список лучших 10 Rails плагинов и gem-ов от Глена Вандербурга (Glenn Vanderburg), опубликованный им в своем блоге: 10 Must-Have Rails Plugins and Gems (2009 Edition).
Новости из почтового ящика.
Sun Microsystems приглашает на вебинар по развертыванию Rails приложений на сервере GlassFish. Вебинар расскажет об использовании GlassFish в качестве надежной платформы для разработки, развертывания и управления Rails приложениями.
Вебинар охватит следующие темы:
Вебинар состоится в среду 23 сентября 2009, 10:00 am PDT (21:00 по московскому времени). Ознакомиться с деталями вебинара и подать заявку на участие: Webinar: Deploy Your Rails Apps on GlassFish.
---
Для развертывания собственных веб-приложений можно арендовать выделенный сервер требуемой конфигурации и с выбранной операционной системой.
Небольшая подборка руководств (на английском языке) по установке Ruby on Rails на Ubuntu разных версий. Две статьи из приведенного списка в свое время мне уже доводилось использовать «по назначению» :). Замечу, что руководства небезупречны в том плане, что:
Все статьи, как я понял, одного автора. Установку Ruby on Rails на Ubuntu 7.04 Feisty Fawn и Ubuntu 8.10 Intrepid Ibex я уже использовал; свое отработали.
Rails Plugin для «клиентской» подсветки синтаксиса.
script/plugin install git://github.com/antono/sh2.git
rake -T sh2
rake sh2:install
Подключение скриптов и стилей для плагина.
include_syntax_highlighter_assets(:themes => :midnight, :brushes => :all)
Следующий хелпер запускает подсветку синтаксиса для полностью загруженной страницы.
sh2_highlight_code
<pre class="brush:ruby">
1000.times { puts 'Руби Руби Руби Руби' }
</pre>
Пару дней назад озадачился генерированием файла sitemap.xml на Ruby on Rails для пользовательских торговых площадок. Приведу упрощенный пример без блогов, форумов и специальных страниц. В файле Sitemap будут url для:
Контроллер (store_controller.rb)
def sitemap
@store = Store.find(params[:id])
@items = @store.items.find :all,
:conditions => "available_for_sale = 1",
:order => "updated_at DESC",
:limit => 49997
end
В соответствии с концепцией MVC, процедуру выборки товаров лучше вынести в модель.
В рекомендациях по файлам Sitemap для Google оговаривается, что файл Sitemap может содержать не более 50000 URL. За вычетом страниц индекса, описания и контактов, остается 49997 позиций для URL товаров.
Представление (sitemap.xml.builder)
xml.instruct! :xml, :version => "1.0", :encoding=>"UTF-8"
xml.urlset(:xmlns => "http://www.sitemaps.org/schemas/sitemap/0.9") {
# Index
xml.url {
xml.loc(url_for :controller => :store, :action => :index, :id => @store.id, :format => :xml, :only_path => false)
lastmod = @items.first.updated_at.strftime("%Y-%m-%d") unless @items.nil?
lastmod = lastmod || Time.now.strftime("%Y-%m-%d")
xml.lastmod(lastmod)
xml.changefreq("daily")
xml.priority(1)
}
# About
xml.url {
xml.loc(url_for :controller => :store, :action => :about, :id => @store.id, :format => :xml, :only_path => false)
xml.lastmod(@store.updated_at.strftime("%Y-%m-%d"))
xml.changefreq("monthly")
xml.priority(0.7)
}
# Contact
xml.url {
xml.loc(url_for :controller => :store, :action => :contact, :id => @store.id, :format => :xml, :only_path => false)
xml.lastmod(@store.updated_at.strftime("%Y-%m-%d"))
xml.changefreq("monthly")
xml.priority(0.5)
}
# Items
@items.each do |item|
xml.url {
xml.loc(url_for :controller => 'store', :action => 'item', :id => item.id, :format => :xml, :only_path => false)
xml.lastmod(item.updated_at.strftime("%Y-%m-%d"))
xml.changefreq("weekly")
xml.priority(0.9)
}
end
}
Страницы пользовательских магазинов у меня выводятся в формате XML с (XSL трансформацией) и при генерации url я использую параметр :format => :xml. В стандартном выводе этот параметр не нужен.
Для каждого URL адреса тег <loc> является обязательным; остальные теги являются дополнительными.
Главная страница магазина (index) и страницы товаров (item) являются наиболее важными страницами, поэтому имеют более высокий приоритет. Страница описания и страница контактов, имхо уже «на интерес». Следовательно, имеют приоритет более низкий.
Индексная страница обновляется довольно часто за счет добавления новых товаров и выбывания товаров из листинга. Поэтому обновляется ежедневно (daily).
Страницы товаров тоже обновляются довольно часто. За счет добавления отзывов, комментариев клиентов. Но эта информация не особо важна. Спокойно могу задать им еженедельное (weekly) обновление.
Информация о магазине и контактах, как правило, изменяется крайне редко, и обновлять ее стоит не чаще, чем раз в месяц (monthly).
Успехов на рельсах! © dotrb.blogspot.com
Сегодня (точнее уже «вчера») приобрел такую вот книженцию.

Среда Ruby on Rails стремительно занимает ведущее место в ряду наиболее популярных платформ для разработки веб-приложений. Она основана на одном из самых элегантных языков программирования, Ruby, и доставляет истинное удовольствие своим приверженцам. Хотите оказаться в первых рядах? Тогда эта книга для вас! Ее автор, Оби Фернандес, и целая группа экспертов подробно описывают основные возможности и подсистемы Rails: контроллеры, маршрутизацию, поддержку стиля REST, объектно-реляционное отображение с помощью библиотеки ActiveRecord, применение технологии AJAX в Rails-приложениях и многое другое. Отталкиваясь от своего уникального опыта и приводя подробные примеры кода, Оби демонстрирует, как с помощью инструментов и рекомендованных методик Rails добиться максимальной продуктивности и получать наслаждение от создания совершенных приложений.
Уже даже начал потихоньку читать. «Потихоньку» буквально означает, что дочитал только до «Введения». Просто сегодня и так хватало работы с этими самыми рельсами.
Model-view-controller (MVC, «Модель-представление-поведение», «Модель-представление-контроллер») – архитектура программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента, так, что модификация одного из компонентов оказывает минимальное воздействие на другие компоненты.
Шаблон MVC позволяет разделить данные, представление и обработку действий пользователя на три отдельных компонента.
- Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контроллера), изменяя свое состояние;
- Представление (View). Отвечает за отображение информации (пользовательский интерфейс);
- Поведение (Controller). Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции.
Модель – это представление определенного участка данных, в общем случае – таблицы базы данных. В модели определяются требования и расчеты необходимые для взаимодействия с этими данными. Обычно требования для формата данных, связи и отношения между данными, методы создания (create), обновления (update), удаления (destroy), поиска (find) и пр.
Каждый раз, когда ты пишешь код, который напрямую взаимодействует с объектом данных, ты должен размещать его в модели.
У нас в проекте изначально было заведено правило размещать громоздкие запросы к объекту данных, например find_by_sql, в модели, представляющей данный объект данных.
Правило controller-model: fat model, skinny controller, «жирная модель, тощий контроллер».
Контроллер – логика между моделью и представлением. Контроллеры содержат методы, которые напрямую относятся к действиям (actions) выполняемым пользователем. Назначение контроллера – отвечать на действия, запрошенные пользователем. Как то: принять параметры, заданные пользователем, обработать эти параметры, задействовать модель, и затем передать запрошенные данные в обработанной форме представлению (view).
Методы контроллера обычно краткие; это небольшие куски кода, выполняющие специфические задачи. Если они содержат более 9-10 строк, это должно тебя насторожить: возможно, ты делаешь слишком много в контроллере и недостаточно в модели (см. правило controller-model).
View (Вид/Представление) – это где данные, обработанные контроллером, получают вывод в формате, запрошенным пользователем. В rails это обычно html, но может быть xml, js, json или другой. Разделение между контроллером и представлением еще более понятное, чем между контроллером и моделью.
Правило controller-view: никакого вывода данных в контроллере, никакой обработки данных в представлении.

ActionScript, C/C++, CSS, Diff, HTML (ERB / Rails), HTML / XML, Java, Javascript, Objective C/C++, Pascal, Perl, PHP, Plain text, Python, Ruby, Ruby (on Rails), Shell Script (Bash), SQL, YAML. Вставьте полученный код javascript в ваш блог и подсветка кода готова.

Код ruby
simple_colors = {
:aliceblue => "f0f8ff",
:antiquewhite => "faebd7",
:aqua => "00ffff",
:aquamarine => "7fffd4",
:azure => "f0ffff",
:beige => "f5f5dc",
:bisque => "ffe4c4",
:black => "000000",
:blanchedalmond => "ffebcd",
:blue => "0000ff",
:blueviolet => "8a2be2",
:brown => "a52a2a",
:burlywood => "deb887",
:cadetblue => "5f9ea0",
:chartreuse => "7fff00",
:chocolate => "d2691e",
:coral => "ff7f50",
:cornflowerblue => "6495ed",
:cornsilk => "fff8dc",
:crimson => "dc143c",
:cyan => "00ffff",
:darkblue => "00008b",
:darkcyan => "008b8b",
:darkgoldenrod => "b8860b",
:darkgray => "a9a9a9",
:darkgreen => "006400",
:darkkhaki => "bdb76b",
:darkmagenta => "8b008b",
:darkolivegreen => "556b2f",
:darkorange => "ff8c00",
:darkorchid => "9932cc",
:darkred => "8b0000",
:darksalmon => "e9967a",
:darkseagreen => "8fbc8f",
:darkslateblue => "483d8b",
:darkslategray => "2f4f4f",
:darkturquoise => "00ced1",
:darkviolet => "9400d3",
:deeppink => "ff1493",
:deepskyblue => "00bfff",
:dimgray => "696969",
:dodgerblue => "1e90ff",
:feldspar => "d19275",
:firebrick => "b22222",
:floralwhite => "fffaf0",
:forestgreen => "228b22",
:fuchsia => "ff00ff",
:gainsboro => "dcdcdc",
:ghostwhite => "f8f8ff",
:gold => "ffd700",
:goldenrod => "daa520",
:gray => "808080",
:green => "008000",
:greenyellow => "adff2f",
:honeydew => "f0fff0",
:hotpink => "ff69b4",
:indianred => "cd5c5c",
:indigo => "4b0082",
:ivory => "fffff0",
:khaki => "f0e68c",
:lavender => "e6e6fa",
:lavenderblush => "fff0f5",
:lawngreen => "7cfc00",
:lemonchiffon => "fffacd",
:lightblue => "add8e6",
:lightcoral => "f08080",
:lightcyan => "e0ffff",
:lightgoldenrodyellow => "fafad2",
:lightgrey => "d3d3d3",
:lightgreen => "90ee90",
:lightpink => "ffb6c1",
:lightsalmon => "ffa07a",
:lightseagreen => "20b2aa",
:lightskyblue => "87cefa",
:lightslateblue => "8470ff",
:lightslategray => "778899",
:lightsteelblue => "b0c4de",
:lightyellow => "ffffe0",
:lime => "00ff00",
:limegreen => "32cd32",
:linen => "faf0e6",
:magenta => "ff00ff",
:maroon => "800000",
:mediumaquamarine => "66cdaa",
:mediumblue => "0000cd",
:mediumorchid => "ba55d3",
:mediumpurple => "9370d8",
:mediumseagreen => "3cb371",
:mediumslateblue => "7b68ee",
:mediumspringgreen => "00fa9a",
:mediumturquoise => "48d1cc",
:mediumvioletred => "c71585",
:midnightblue => "191970",
:mintcream => "f5fffa",
:mistyrose => "ffe4e1",
:moccasin => "ffe4b5",
:navajowhite => "ffdead",
:navy => "000080",
:oldlace => "fdf5e6",
:olive => "808000",
:olivedrab => "6b8e23",
:orange => "ffa500",
:orangered => "ff4500",
:orchid => "da70d6",
:palegoldenrod => "eee8aa",
:palegreen => "98fb98",
:paleturquoise => "afeeee",
:palevioletred => "d87093",
:papayawhip => "ffefd5",
:peachpuff => "ffdab9",
:peru => "cd853f",
:pink => "ffc0cb",
:plum => "dda0dd",
:powderblue => "b0e0e6",
:purple => "800080",
:red => "ff0000",
:rosybrown => "bc8f8f",
:royalblue => "4169e1",
:saddlebrown => "8b4513",
:salmon => "fa8072",
:sandybrown => "f4a460",
:seagreen => "2e8b57",
:seashell => "fff5ee",
:sienna => "a0522d",
:silver => "c0c0c0",
:skyblue => "87ceeb",
:slateblue => "6a5acd",
:slategray => "708090",
:snow => "fffafa",
:springgreen => "00ff7f",
:steelblue => "4682b4",
:tan => "d2b48c",
:teal => "008080",
:thistle => "d8bfd8",
:tomato => "ff6347",
:turquoise => "40e0d0",
:violet => "ee82ee",
:violetred => "d02090",
:wheat => "f5deb3",
:white => "ffffff",
:whitesmoke => "f5f5f5",
:yellow => "ffff00",
:yellowgreen => "9acd32"
}Код ruby: сортировка по насыщенности
ordered_colors = simple_colors.sort{|a,b| ( a[1][0,2].to_i(16)+a[1][2,2].to_i(16)+a[1][4,2].to_i(16) )<=>(b[1][0,2].to_i(16)+b[1][2,2].to_i(16)+b[1][4,2].to_i(16))}sort класса Hash возвращает массив (Array).Пример: hsh.sort -> anArray
h = { "a" => 20, "b" => 30, "c" => 10 }
h.sort » [["a", 20], ["b", 30], ["c", 10]].rhtml):<style type="text/css">
.colorPick {
width:16px; height:16px; float:left;
border:2px solid #FFF;
margin:1px;
}
</style>
<!-- ... -->
<%
ordered_colors.each do |color|
name = color[0]
value = color[1]
%>
<div class="colorPick"
style="background-color: #<%= value %>"
title="<%= name %>">
</div>
<% end %>
$), а подстановку значений переменных -- с ним. Блажь у меня такая.@server constants {
variableName: variableValue;
}
body {
color: $variableName;
}Пример: необработанный HTML
<style type="text/css">
@server constants {
bodyBackgroundColor: #FFF;
bodyFaceColor: #000;
bodyFont: 11px/1.5em Arial, Helvetica, sans-serif;
}
body {
font: $bodyFont;
background-color: $bodyBackgroundColor;
color: $bodyFaceColor;
}
</style>
<style type="text/css"></style>.Ruby-модуль css_ssc_module.rb
def ssc_get_style_contents(pattern, text)
matches = text.scan(pattern)
str_out = matches.to_s
return str_out
end
pattern (regular expression) -- шаблон RegExp по которому будет осуществляться выбор;text (String) -- текст страницы, где будет осуществляться поиск и выборка.<style type="text/css"></style>.pattern внутри самой функции? Это регулярное выражение нам еще раз понадобится при подстановке сгенерированного CSS обратно на страницу. Правильнее будет ее определить только в одном месте.[variableName, variableValue] внутри блока @server constants {}$variableName их значениями variableValue;@server constants {}.Ruby-модуль css_ssc_module.rb
def ssc_process_server_variables(css)
pattern = /@server\s+(?:variables|constants)\s*\{\s*([^\}]+)\s*\}\s*/i
pattern2 = /([^:\}\s]+)\s*:\s*([^;\}]+);/
str_out = css
if ( matches = css.scan(pattern) )
matches.each do |match|
vars = match[0].scan(pattern2)
vars.each{|var, value| css.gsub!("$#{var}", value)}
end
css = css.gsub!(pattern, '')
str_out = css unless css.nil?
end
return str_out
end
css (String) -- текст CSS.Ruby-модуль css_ssc_module.rb
def ssc_serve_styles(text)
pattern = /^\<style\ \b[^>]*>((\s|.)+?)\<\/style\>/i
css = ssc_get_style_contents(pattern, text)
css_out = ssc_process_server_variables(css)
text.gsub!(pattern, "<style type='text/css'>#{css_out}</style>")
return text
end
text (String) -- «сырой» текст страницы.ssc_serve_styles(text), получим следующий код HTML.Пример: обработанный HTML
<style type="text/css">
body {
font: 11px/1.5em Arial, Helvetica, sans-serif;
background-color: #FFF;
color: #000;
}
</style>
aptitude install g++-3.4 gcc-3.4
cd /usr/bin
rm cpp gcc g++
ln -s g++-3.4 g++
ln -s gcc-3.4 gcc
ln -s cpp-3.4 cpp
cd /usr/src/
wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8-rc2.tar.gz
tar -zxf sphinx-0.9.8-rc2.tar.gz
cd sphinx-0.9.8-rc2
cd /usr/src/sphinx-0.9.8-rc2
./configure CC=gcc-3.4
make
make install
# for grid only
mkdir /mnt/ferret/sphinx
ln -sf /mnt/ferret/sphinx /var/db/sphinx
#
mkdir -p /var/db/sphinx/log
chmod -R 777 /var/db/
gem install chronic
RAILS_APP/config/ultrasphinx/.RAILS_ENV=development rake ultrasphinx:bootstrap
RAILS_ENV=development rake ultrasphinx:configure
RAILS_ENV=development rake ultrasphinx:daemon:start
00-59/10 * * * * www-data cd $RAILS_ROOT && RAILS_ENV=$RAILS_ENV rake ultrasphinx:index >/dev/null 2>&1
page.replace_html "element_id", :partial => "file.rhtml"<?php
$string = get_include_contents('somefile.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
return false;
}
?>
, совместно с провайдером предоставляют разработчикам Web-приложений для один год бесплатного хостинга. Это предложение будет основываться в бесплатном размещении их приложений для социальной медийной сети с поставляемым пользователями наполнением. Кроме того, разработчикам будут доступны инструменты Java, PHP, Ruby on Rails, а также Sun Web 2.0 Scalable Performance Toolkit и Apache Olio, находящиеся на стадии разработки, с помощью которых разработчики смогут создавать, отлаживать и развертывать социальные Bebo-приложения.:order, ORDER BY) в Ruby on Rails с использованием Associated Model.@files = File.find(:all, :include => :label, :order => "labels.name ASC, files.name")
# files belongs_to :label
# labels has_many :files
@store = Store.find(params[:id])
@files = @store.files.find(:all, :include => :label, :order => "labels.name ASC, files.name")
# files belongs_to :store
# stores has_many :files
На сайте guides.rails.info опубликовано наиболее полное руководство по безопасности Rails приложений -- Ruby On Rails Security Guide.
xml.tag!("advanced"){
xml << link_to(image_tag("/images/template/buttons/search-advanced.gif", {:alt => "advanced", :class => "imagebutton"}),
:controller => '/search', :seller => @store.id)
}<xsl:element name="a">
<xsl:attribute name="href" >
<xsl:value-of select="advanced/a/@href" />
</xsl:attribute>
<xsl:text>Advanced Search</xsl:text>
</xsl:element>
<a>) и присвоил ей атрибут href дочернего элемента <advanced>: "advanced/a/@href".В блоге охотно делюсь примерами как из собственного опыта веб-разработки, коей посвятил уже более 5 лет своей жизни, так и просто интересными находками.
Будь то программирование или верстка, дизайн или настройка шаблонов Blogger – мне интересно все. И так или иначе все это найдет отражение на страницах моего блога.