Прекрасные контроллеры в Rails 3
03/09/2010 14:29
Зацените, кто еще не видел, насколько меньше кода стало в контроллерах Rails 3! Теперь можно сказать, что контроллеры стали по-настоящему соответствующими принципу DRY. И всё это благодаря респондерам. В общем, мне нравится:
class ProductsController < ApplicationController
respond_to :html, :xml
def index
respond_with(@products = Product.all)
end
def show
respond_with(@product = Product.find(params[:id]))
end
def new
respond_with(@product = Product.new)
end
def create
@product = Product.new(params[:product])
flash[:notice] = "Successfully created product." if @product.save
respond_with(@product)
end
def edit
respond_with(@product = Product.find(params[:id]))
end
def update
@product = Product.find(params[:id])
flash[:notice] = "Successfully updated product."
if @product.update_attributes(params[:product])
respond_with(@product)
end
def destroy
@product = Product.find(params[:id])
@product.destroy
flash[:notice] = "Successfully destroyed product."
respond_with(@product)
end
end
В респондерах теперь содержится вся та магия по отдаче ответа клиенту, которая раньше находилась в контроллере, в методе respond_to. Сейчас стало удобно контролировать отдачу типов контента - ну нужно править каждый метод контроллера, если вы захотите добавить или убрать тип контента. Кстати, метод respond_to поддерживает ключи :only и :except, чтобы контролировать типы контента для методов.
Самое главное - это все работает, и работает замечательно! Я сейчас пишу проект на Rails 3 и использую всю эту красоту. В общем - радости нет предела)
Рекомендую почитать вот эту статейку на английском: Controllers in Rails 3
Отличная презентация об улучшениях в коде проекта на Rails 3
31/08/2010 20:07
Смотрим, как нужно писать код теперь. Мне презентаха очень понравилась!
Installing Ruby 1.9.2 and Rails 3 stable on Ubuntu
31/08/2010 18:40
Let’s install Ruby 1.9.2 and Rails 3 stable on Ubuntu. I’m going to use just one Ruby version so, this installation without RVM (Ruby Version Manager). I’m using Ubuntu 10.04, 32 bit version.
If you have not yet installed the following packages - install them:
$ sudo apt-get install gcc g++ build-essential libssl-dev libreadline5-dev zlib1g-dev linux-headers-generic
Now download Ruby 1.9.2 sources, unpack them and install:
$ wget ftp://ftp.ruby-lang.org//pub/ruby/1.9/ruby-1.9.2-p0.tar.gz
$ tar -xvzf ruby-1.9.2-p0.tar.gz
$ cd ruby-1.9.2-p0/
$ ./configure --prefix=/usr/local/ruby
$ make && sudo make install
Add path to binary Ruby files.
$ sudo gedit /etc/environment
You need to add in the PATH variable that path - /usr/local/ruby/bin, should look something like this:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/ruby/bin"
Then run the source command for the file /etc/environment to apply changes.
$ source /etc/environment
Now check is Ruby installed properly:
$ ruby -v
You should see something like this: ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]
Now create a symbolic link for ruby and gem program
$ sudo ln -s /usr/local/ruby/bin/ruby /usr/local/bin/ruby
$ sudo ln -s /usr/local/ruby/bin/gem /usr/bin/gem
Ruby 1.9.2 is already includes Rubygems, so you do not have to install it.
Now install the required gem packages, including Rails 3.:
$ sudo gem install tzinfo builder memcache-client rack rack-test erubis mail text-format bundler thor i18n sqlite3-ruby
$ sudo gem install rack-mount --version=0.4.0
$ sudo gem install rails --version 3.0.0
Check Rails version:
$ rails -v
You should see the version number 3.0.0. Otherwise, try to execute command source /etc/environment and enter rails -v command once again.
Now you are ready to create a new Rails 3 application:
$ rails new myproject
cd myproject
rails server
Установка Ruby 1.9.2 и Rails 3 stable на Ubuntu
31/08/2010 18:25
Давайте установим Ruby 1.9.2 и Rails 3 stable на Ubuntu. Я использовал Ubuntu 10.04, 32-х битную версию. Здесь рассматривается установка Ruby без RVM, так что если будете следовать этому мануалу, то сначала удалите старую версию Ruby и её зависимости.
Если у вас еще не установлены следующие пакеты - установите их:
$ sudo apt-get install gcc g++ build-essential libssl-dev libreadline5-dev zlib1g-dev linux-headers-generic
Теперь скачаем исходники Ruby 1.9.2, распакуем их и установим:
$ wget ftp://ftp.ruby-lang.org//pub/ruby/1.9/ruby-1.9.2-p0.tar.gz
$ tar -xvzf ruby-1.9.2-p0.tar.gz
$ cd ruby-1.9.2-p0/
$ ./configure --prefix=/usr/local/ruby
$ make && sudo make install
Добавим путь к бинарным файлам Ruby.
$ sudo gedit /etc/environment
Вам нужно добавить в переменную PATH этот путь - /usr/local/ruby/bin, должно получиться примерно так:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/ruby/bin"
Затем выполним команду source для файла, чтобы применить изменения.
$ source /etc/environment
Теперь проверим, установился ли Ruby:
$ ruby -v
Вы должны увидеть примерно следующее: ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]
Теперь создадим символическую ссылку, чтобы программа gem работала
$ sudo ln -s /usr/local/ruby/bin/ruby /usr/local/bin/ruby
$ sudo ln -s /usr/local/ruby/bin/gem /usr/bin/gem
Ruby 1.9.2 уже содержит Rubygems, поэтому вам не придется его устанавливать.
Теперь установим нужные пакеты gem, включая rails 3.:
$ sudo gem install tzinfo builder memcache-client rack rack-test erubis mail text-format bundler thor i18n sqlite3-ruby
$ sudo gem install rack-mount --version=0.4.0
$ sudo gem install rails --version 3.0.0
Проверим версию rails:
$ rails -v
Вы должны увидеть номер версии 3.0.0. Если этого не произошло, по попробуйте выполнить команду source /etc/environment, затем запустите rails -v еще раз.
Теперь всё готово к созданию нового приложения rails:
$ rails new myproject
cd myproject
rails server
Интервью с владельцем интернет-магазина
30/08/2010 12:34
Недавно у меня появилась идея открыть интернет-магазин, поэтому сейчас я крайне интересуюсь всем, что связано с онлайн-торговлей, организацией продаж, логистикой и прочим. Но пока мне нечем похвастаться, поэтому представляю интервью с Вадимом, моим товарищем и бывшим коллегой, который сейчас является владельцем собственного интернет-магазина. Я не стал вдаваться в подробности - у всех есть свои секреты и лезть в них было бы глупо, я обошелся достаточно общими, но интересными для меня вопросами, надеюсь, интервью будет интересно и для вас, читателей сего блога. И да, это не реклама - у меня нет рекламных постов в блоге. Read more
К вопросу об эффективности
27/08/2010 13:33
Привет.
Сегодня моему коллеге понадобилось внести количество населения в городах России в его табличку cities в БД. Он, конечно, начал писать парсер Википедии, дабы добыть нужную информацию из страниц городов на сайте. То есть, он хотел обращаться к Википедии примерно так:
http://ru.wikipedia.org/wiki/<название города>
Он просто обращался по этому адресу при помощи php-функции file_get_contents(), но ему возвращалась 403 ошибка. Я обратился телнетом к странице и узнал, что Википедия требует присутствие заголовка User-Agent в HTTP-запросе.
Показал коллеге как юзать telnet и формировать HTTP-запрос =) Этим убедил его в том, что ему нужно юзать cURL. И он принялся писать свой мега-парсер.
Но лично я получил требуемый список городов за 5 минут. Как я это сделал? Я просто использовал более подходящие инструменты и шел легким путем.
Для начала я нашел HTML-табличку со списком городов и населением в них. Потом я скопировал эту табличку при помощи firebug в отдельный HTML-файл, подключил туда JQuery с Google CDN, и написал абсолютно тупой джаваскрипт, который обходил табличку и забирал оттуда нужные данные, а потом писал их в лог при помощи console.log(). Знаю, что можно было выполнить свой JS прямо на странице Википедии, но не знаю почему так не сделал :). Дальше осталось только передать эти данные коллеге.
Я потратил на это всего минут 5, мой коллега потратил бы на это половину рабочего дня, т.к. парсинг HTML-страниц в PHP это дело непростое, там нет Mechanize, к тому же Википедия может забанить по IP при парсинге кучи страниц :).
Вот как-то так, стоит всегда использовать подходящие инструменты и немного задействовать программерскую смекалку.
New Mysql connector for Nodejs
20/08/2010 00:28
Briefly: here’s a new connector to Mysql for Nodejs. In my opinion, it gives great hope)
So, you can get more info at github page: node-mysql-libmysqlclient
Установка Ruby и RoR на Ubuntu 10.04
18/08/2010 16:42
Если вы используете Ubuntu 10.04 или 9.10, то следующие шаги по установке будут одинаковы для той и другой версии ОС. Чтобы установить Ruby on Rails, сначала вам нужно установить некоторые примочки, а так же сам Ruby.
Можно установить Ruby из репозитория, либо из исходного кода. Чтобы установить Ruby из репозитория, наберите в терминале следующую строку:
$ sudo apt-get install ruby-full build-essential
Если же вы хотите установить из исходников, то сначала нужно установить следующие пакеты:
$ sudo apt-get install build-essential libssl-dev libreadline5-dev zlib1g-dev
Теперь вам нужно скачать архив с исходными кодами Ruby:
$ wget ftp://ftp.ruby-lang.org/pub/ruby/stable-snapshot.tar.gz
Разархивируем файлы:
tar xzf stable-snapshot.tar.gz
Компилируем и устанавливаем Ruby:
$ cd ruby/
$ ./configure
$ make
$ sudo make install
Теперь запустите в консоли команду irb, и если вы не увидите никаких ошибок - поздравляю, Ruby установился успешно.
Перед тем, как установить Rails, вам нужно установить некоторые пакеты gem. Gem-пакеты - это упакованные приложения или библиотеки Ruby. Вы можете использовать команду gem чтобы установить различные бесплатные библиотеки, включая и Rails. Подробнее о rubygems можно почитать в мануале.
Устанавливаем rubygems следующей командой:
$ wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.2.tgz
$ tar xzvf rubygems-1.3.2.tgz
$ cd rubygems-1.3.2
$ sudo ruby setup.rb
$ sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
Теперь при помощи команды gem устанавливаем Rails:
$ sudo gem install rails
Эта команда установит последнюю версию Rails, но если вы хотите установить одну из предыдущих версий, например 2.2.2, то воспользуйтесь следующей командой:
$ sudo gem install –version = 2.2.2 rails
Установка MongoDB для Ubuntu 10.04 из пакета
17/08/2010 13:10
MongoDB можно собрать вручную, а можно и установить из пакета. Я предпочитаю последнее, так как это гораздо проще и занимает меньше времени. К тому же, нам не нужно добавлять init.d скрипты - все добавится само.
Сначала добавим репозиторий в sources.list. Откроем файл:
sudo gedit /etc/apt/sources.list
и добавим в конец файла строку:
deb http://downloads.mongodb.org/distros/ubuntu 10.4 10gen
Затем, добавим ключ при помощи следующей команды:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
И обновим кэш:
sudo aptitude update
Всё. Теперь тупо ставим mongoDB из пакета:
sudo aptitude install mongodb-stable
После установки, проверим, все ли установилось. Для этого в консоли можно запустить mongo-shell:
mongo
Дальше можно поменять dbpath в конфиге и указать место, где у вас хранится база данных. Не забудьте сделать эту папку доступной для записи юзеру mongodb.
sudo gedit /etc/mongodb.conf
После редактирования конфига перезапустим mongod:
sudo service mongodb restart
Вот вроде бы и все. Дополнительную информацию смотрите здесь: http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages
А как вы проверяете mime-type файлов в php?
03/08/2010 19:13
Как известно, все загружаемые на сервер файлы нужно проверять на соответствие разрешенным mime-type. Большинство программистов проверяют это соответствие, сверяясь с mime-типом из $_FILES, но этот mime-тип берется из заголовков HTTP запроса и может быть определен неправильно, т.к. определяет его браузер. У меня например, некоторые jpeg-файлы определяются как application/octet-stream и естественно, скрипт их не принимает. К тому же решение построенное на проверке mime-типа из HTTP заголовка потенциально опасно, т.к. заголовки можно подделать и указать любой mime-тип.
Как же сделать правильно?
Нужно установить расширение PECL, которое называется Fileinfo. Это расширение является заменой более старого расширения mime_magic. Валидатор MimeType в Zend Framework использует именно Fileinfo, как наиболее приоритетный способ определения mime-типа. Fileinfo определяет mime-тип по специальным сигнатурам, которые есть внутри файла.
Другой способ состоит в том, чтобы переложить определение mime-типа на веб-сервер. У веб-сервера Apache есть специальный файл magic с сигнатурами, с помощью которого он определяет, какого mime-типа является загружаемый файл, и устанавливает это значение в заголовок. Таким образом, в php скрипт придет верный mime-тип.
Для того, чтобы, Apache определял mime-тип файла, нужно включить модуль mod_mime_magic.
Небольшой офф: не забывайте так же проверять тип файлов еще и по расширению.