var randomHash = (function () {
var letters = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';
return function (len) {
var result = '';
for (var i=0; i < len; i++) {
result += letters[Math.floor(Math.random() * letters.length)];
};
return result;
};
})();
Случайно наткнулся на вакансию в Луганске, буду пробовать — дали тест-задание. Сроки нормальные, 2 недели, однако надо все сделать по-быстрому и качественно. С другой стороны, интересно, сколько в Луганске программистов на руби…
Следующие планы на обучение — изучить API таких сервисов как Facebook, Twitter, Vkontakte и возможно, какой-нибудь платежной системы. Так же неплохо было бы продолжить учить jQuery, как раз в тестовое задание и встрою его.
Пара деньков командировки впереди, значит будет время пописать код и почитать мануалы. Надеюсь все успею.
Вчера проходил тестовое задание, которое звучало примерно так: Сделать книгу контактов, где у каждого контакта есть неопределенное количество полей информации, и которые можно динамически добавлять при создании\редактировании контакта.
Как прицепить замечательный визуальный редактор к приложению на рельсах. Это довольно просто, хотя и сложнее простой установки гема. Я использовал статью, вольный перевод которой и хочу вам предложить.
Итак, для того что бы начать использовать этот замечательный редактор его нужно сначала . Я дал ссылку на прямое скачивание версии для jQuery, который используется в моих проектах.
Далее надо создать каталог «public/javascripts/tiny_mce» в него скопировать содержимое архива из каталога «jscripts/tiny_mce», то есть в итоге у вас должны оказаться каталоги «langs», «plugins» и «themes» в каталоге «public/javascripts/tiny_mce».
Теперь создайте новый файл «public/javascripts/mce_editor.js» и поместите в него инициализирующий код Tiny MCE:
// Example content CSS (should be your site CSS) content_css : "css/example.css",
// Drop lists for link/image/media/template dialogs template_external_list_url : "js/template_list.js", external_link_list_url : "js/link_list.js", external_image_list_url : "js/image_list.js", media_external_list_url : "js/media_list.js",
// Replace values for the template plugin template_replace_values : { username : "Some User", staffid : "991234" } });
Собственно этот файл является так же файлом настройки Tiny MCE, и разобраться в нем довольно просто.
Теперь откройте файл "app/helpers/application_helper.rb" и добавьте в него следующие методы:
def use_tinymce @content_for_tinymce = "" content_for :tinymce do javascript_include_tag "tiny_mce/tiny_mce" end @content_for_tinymce_init = "" content_for :tinymce_init do javascript_include_tag "mce_editor" end end
Как я уже говорил, я использовал jQuery в проекте, он ставиться простым гемом jquery-rails поэтому у меня код в макете несколько отличается от оригинальной статьи. Измените макет "layouts/application.html.erb" таким образом:
Так, теперь для того, что бы вывести редактор на экран нужно перед текстовым полем написать строчку: < % use_tinymce —% > А к хелпертегу добавить класс «mce-editor»: < %= textarea_tag :foo, :bar, :class = > «mce-editor» % > Вот и все. Теперь, что бы использовать Tiny MCE в месте вывода текста используйте метод raw, например: < %= raw(post.content) % >
Новые планы, новые задачи и обязанности. На той неделе меня типа повысили, навешав на меня кучу обязанностей по организации работы отдела сервиса. Работа, собственно, не связанная с компьютерами, однако пообещали денег дополнительно. Теперь отрабатывать схему новой работы буду.
Наконец-то закончился период активной разработки рекламных материалов и я опять могу погрузиться в руби и сайт.
Вчера купил одежды новой, ну или почти новой)) Клевую рубашку, бурячного и черного цвета футболки, и пару джинс, одни такие летние расхлобузные, а вторые строгие темные… В общем клево.
Сегодня надо уточнить вопрос с поездкой в Киев… Ой как надо.
Та-дам, гроза и у половины города не работает интернет. Собственно, что бы понять халатность и параною провайдеров есть идея для «стартапа». У многих сейчас кроме основного и широкого интернет канала есть маленький и узенький мобильный канал. Вот тут то и можно получать жалобы от пользователей. Выбираем провайдера, благо их не так много, имя пользователя (это вроде как не конфиденциальная информация), наличие и работу локальной сети, тип подключения, именованный адрес и период неработающего интернета. Заявка по умолчанию считается активной 2 дня, после этого статус перемещается в исправленные. После этого можно составить графики надежности провайдеров.
Изучая пока что основы rails 3 я столкнулся с вопросом реализации тегов. Более фундаментально он звучал для меня так: Как делать связанные таблицы многие к многим. Итак. Пускай будут две модели post и tag которые мы или сгенерировали скаффолдом.
rails g scaffold post title:string content:text rails g scaffold tag value:string
И пока не делаем миграцию. Соответственно у постов могут быть теги, однако мы так же хотим получать через теги посты которые их имеют. Вот к чему надо привести модели постов и тегов:
class Post < ActiveRecord::Base has_and_belongs_to_many :tags end
class Tag < ActiveRecord::Base has_and_belongs_to_many :posts end
Затем надо создать связывающую таблицу. Для этого надо сгенерировать миграцию такого вида: rails g migration posts_tags Это создаст валидную пустую миграцию. По умолчанию rails будет искать связи именно в этой таблице, причем последовательность названия полей должна быть по алфавиту. После создания файла миграции, его нужно немного подправить, а именно привести миграцию к такому виду:
class PostsTags < ActiveRecord::Migration def self.up create_table :posts_tags, :id= >false do |t| t.integer :post_id t.integer :tag_id end end
def self.down drop_table :posts_tags end end
После этого запускаем миграцию командой
rake db:migrate
Теперь мы можем обращаться двусторонне как post.tags так и tag.posts. Однако, при создании новых тегов для поста они заново создаются и в таблице tags, что нам категорически не нужно. Для того, что бы исправить это, при создании тега проверяем, есть ли он уже в базе при помощи Tag.where(«value = ?», tag) и если есть, то добавляем найденный тег к тегам поста, в другом случае создаем тег
Итак, для того, что бы потренироваться в использовании рельсов я решил перевести на динамический движок сайт kuzmina.com.ua и буду использовать для него самописную CMS. Основные вехи, которые я собираюсь реализовать: Авторизация и администрирование Админ-панель Редактирование страниц Сохранение черновиков Загрузка файлов Динамические и статические страницы (лента постов) Генерация галерей на rails Просмотрщик галерей на jquery Комментирование фотографий с помощью виджета комментариев ВКонтакте Интеграция с Facebook Кнопки с Facebook и Twitter Форма обратной связи Акцент на продажу услуг Акцент на свежие фотографии и комментарии, для создания видимости обновления сайта
Я поглядел замечательный по этому поводу, но тем кто не знает английского, приведу свои действия:
Для начала поставим новый джем файл 'carrierwave', который отвечает за загрузку файлов. Для этого надо добавить в Gemfile строчку
gem 'carrierwave'
А затем выполнить команду
bundle install
Кстати, если вы встраиваете в разрабатываемый до этого проект и что то не заработает, попробуйте обновить пакеты командой:
bundle update
Вы поставили джем и в нем есть генератор, который и решит большинство задач по загрузке файлов. Я не буду описывать все достоинства этого джема, но он очень хорош. Итак, что бы мы могли им пользоваться и настроить его напишите команду
rails g uploader image
В данном случае image это то, что нужно было загружать мне Эта команда создаст файл в директории app/uploads, открыв который вы увидете закомментированные настройки. Там все просто и при желании вы можете поизменять их, однако я оставил их по умолчанию.
Далее, мне нужно привязать к какой-то модели загружаемый файл. У меня уже была модель с задачами, и я решил добавить новую миграцию, в которой к таблице с задачами добавил новое поле... Напишите в командной строке:
rails g migration add_image_to_tasks image:string
А затем выполните миграцию:
rake db:migrate
После успешной миграции надо прицепить загрузчик к модели, открываем файл app/models/task.rb
и добавляем туда строчку:
mount_uploader :image, ImageUploader
первое это фунция прицепления, второе - к какому полю прицепляемся и третье - какой зарузчик используем (мы его делали с помощью генератора uploader)
Далее переходим к виду. В нужном месте вставляем хелпертег:
< %= f.file_field :image% >
Это при условии что вы используете форму со стандартного скаффолда. Кроме того, необходимо в хелпертэг формы добавить следущий хэш:
:html = > {:multipart = >true}
Теперь по кнопке "Отправить" на сервер будет загружаться выбранный файл.
Что бы получить этот файл, используем метод image_url для модели Task Например:
Вчера сходил в трензал, сеня такая приятная усталость в мышцах, обидно что пропустил несколько занятий. Надо будет еще гейнер купить, чтоб массу набирать быстрее и на пресс налягать, чтоб кубики играли:D
А сегодня стартую по задачу переделке листовок, думаю за пару дней справлюсь.
И еще, вроде бы в Киев в начале июля поеду, а потом может быть и перееду туда… Так вот связанные мысли: в Киеве больше вакансий и всяких ивентов, надо усиленно учить рельсы и джейквери, поучавствовать в синерджи, если получится, хотя бы для того, что бы понимать работу в коллективе, попробовать дашин сайт перенести на рельсы с админкой и редактированием. В общем идей много, и все они помогут мне найти хорошую работу в Киеве:D
Отличную сумку купил в дерби за 200 грн, как раз нетбук помещается, тормозок на работу и еще чуток итемов:D Старая сумка была куплена за 18 грн на распродаже, и прослужила мне 2 года, посмотрим на что способна эта
Пришла идея сделать универсальный СSS для таблиц. Идея в следущем: Делаем класс, для дива, и в него пихаем таблицу, а css файлом уже марафетим внутренние теги этого класса. Подключаем отдельно.
Кароче все закончилось блясдством с фаерфоксом, который не хочет мне рисовать границы таблиц при border-collapse:collapse
Я одобрил пруфы, хоть там и были некоторые недаработки. Буду надеятся что для печати пруфы с большим dpi.
Нервиничаю и переживаю, но пока только чуть-чуть, а вот когда распаковывать буду… Каталоги, по цене порядка 10 000 грн, 2000 экз. И если что-то будет не так, мне прийдется ооочень не сладко.
Жду пруфы с полиграфии, такие пдвки который последний рубеж перед печатью. Прислали ссылку — она ведет вникуда, сервер не настроен нормально, замутил в файлзилле — зашло.
Скачал пруфы, там два файла тока в папке было, а они не мои:D Всякие шоколадные конфеты и сладкие спокусы.