пятница, 23 января 2009 г.

Mailtrap

А для тестирования отправки почты есть mailtrap
http://rubymatt.rubyforge.org/mailtrap/

Тестирование через Silenium

Если у кого обламывается селен установленный из официального репозитория SVN
юзайте этот, пропатченный
http://github.com/paytonrules/selenium-on-rails/tree/master

вторник, 20 января 2009 г.

Отличный hint

Источник: http://workswithruby.com/2008/4/5-rails-tips
Правильно показывать дату легче так:

ActiveSupport
::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(
:client_readable => "%A %B %d at %H:%M", # => Friday April 25 at 11:10
:client_reports => "%d/%m/%Y at %H:%M" # => 25/04/2008 at 11:10
)

Last updated on %= @post.updated_at.to_s(:client_readable) %
# =
>
"Last updated on Friday April 25 at 11:20"

Обработка в background

http://github.com/imedo/background/tree/master
   background do
# do some time-consuming task
end
daemon_generator
http://github.com/dougal/daemon_generator/tree/master
To get yourself rolling:
> sudo gem install daemons
> ./script/generate daemon

Then insert your code in the lib/daemons/.rb stub. All pid's and logs will live in the normal log/ folder. This
helps to make things Capistrano friendly.

Individual control script:
> ./lib/daemons/_ctl [start|stop|restart]

App-wide control script (I add this to my capistrano recipe's after_restart task):
> ./script/daemons [start|stop|restart]

Тотальная русификация Rails

полностью использовать наработки i18n в Rails, перевод локали даты, плюрализации предоставляет этот плагин:
http://github.com/yaroslav/russian/tree/master

понедельник, 19 января 2009 г.

label_for

оказывается, работает такая конструкция:
 <%= f.label :firstname, 'First Name' %>
>

<%= f.text_field :firstname %>

суббота, 17 января 2009 г.

правильный способ заставить capistrano сохранять загруженные файлы

Что бы файлы, которые были загружены в public не терялись при разных deploy, есть такой recipe
set :app_symlinks, %w( videos )

desc "Symlinks the :app_symlinks directories from current/public to 
shared/public"
task :symlink_public do
  if app_symlinks
    app_symlinks.each do |link|
      run "ln -nfs #{shared_path}/public/#{link} #{current_path}/
public/#{link}"
    end
  end
end

namespace :deploy do
  task :after_symlink, :roles => [:app, :web] do
    symlink_public
  end
end

правильный способ заставить capistrano сохранять загруженные файлы

Что бы файлы, которые были загружены в public не терялись при разных deploy, есть такой recipe
set :app_symlinks, %w( videos )

desc "Symlinks the :app_symlinks directories from current/public to
shared/public"
task :symlink_public do
if app_symlinks
app_symlinks.each do |link|
run "ln -nfs #{shared_path}/public/#{link} #{current_path}/
public/#{link}"
end
end
end

namespace :deploy do
task :after_symlink, :roles => [:app, :web] do
symlink_public
end
end

Красивые тайтлы в ROR

Очень качественный способ,
во вьюшке указываем просто
<% title "My title"%>
что может быть проще?
# application_helper.rb
def title(page_title)
content_for(:title) { page_title }
end

http://railscasts.com/episodes/30

пятница, 16 января 2009 г.

deep nested form resources

<% form_for [:admin, @page, @asset], :html => { :multipart => true } do |form|-%>
Название:
<%= form.text_field :title %>

<%= form.file_field :uploaded_data %>
<%= form.submit "Отправить" %>
<% end -%>

Отличный способ исчезающей нотификации

<% if flash[:notice] -%>
<%= flash[:notice] %>


<% end -%>

<% if flash[:notice] -%>
<%= flash[:notice] %>


<% end -%>

error_messages_for

Когда идет пост на restful контроллер, т.е. с new на create, а с edit на update,
то error_messages_for просто будет утерян по причине редиректа.
Тогда делаем грязный хак:

def create def update
@page=Page.find_by_id(params[:id])
if @page.update_attributes(params[:page])
flash[:notice]="Страница была успешно сохранена"
redirect_to params[:continue]?edit_admin_page_url(@page):admin_pages_url
else
flash[:page]=@page
redirect_to edit_admin_page_url(@page)
end
end

def edit
@page=flash[:page]?flash[:page]:Page.find_by_id(params[:id])
end


end

четверг, 15 января 2009 г.

ActiveRecord, boolean и MySQL

Разрабатываю на sqlite3 сайт, выгружаю в mysql на хостинг, и опа, boolean колонки обрабатываются странно на предмет find_by_active(true), точнее в sqlite3 это работает, а в mysql не работает :(
А вот оно что:

Each of the database adapters is responsible for determining how to
handle a boolean column in a way that makes sense for their specific
backend. In the case of PostgreSQL and OpenBase this is trivial,
since these database backends have a boolean type column built-in.
For MySQL - as has been pointed out - booleans are usually handled as
tinyint. The MySQL adapter therefore will default to handle tinyint
columns as booleans. However, this behavior can be changed by
setting MysqlAdapter.emulate_booleans = false.

If you define your schema within rails and give the column a type
of :boolean, then the adapter you are using will create a column of
whatever type makes sense for that database, thus achieving (at least
to this extent) database agnosticism. Beautiful. Sorta brings a
tear to your eye, doesn't it?

-Derrick Spell

среда, 14 января 2009 г.

Навигация по человеческим URL

А приспичило вот сделать навигацию так, что бы не указывать контроллер для страниц в корне сайта.
Оказалось, достаточно просто это делается:
в routes.rb пишем
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
map.connect ':url', :controller=>'page', :action=>'show'
и вуаля
все что не попало под определения контроллеров и екшенов попадет под контроллер page и вызовет action show, куда передаст url как параметр, что вполне позволит сделать вот так:
@page=Page.find_by_url(params[:url]) и работать со страницей, фактически не существующей в корне сайта.

acts_as_tree not found

если script/plugin install не находит нужного плагина, то следует выполнить
script/plugin discover