А для тестирования отправки почты есть mailtrap
http://rubymatt.rubyforge.org/mailtrap/
пятница, 23 января 2009 г.
Тестирование через Silenium
Если у кого обламывается селен установленный из официального репозитория SVN
юзайте этот, пропатченный
http://github.com/paytonrules/selenium-on-rails/tree/master
юзайте этот, пропатченный
http://github.com/paytonrules/selenium-on-rails/tree/master
среда, 21 января 2009 г.
Rspec story runner будет заменен на Cucumber
http://blog.davidchelimsky.net/2008/9/22/cucumber
лучше переходить уже сейчас
лучше переходить уже сейчас
вторник, 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
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"%>
что может быть проще?
http://railscasts.com/episodes/30
во вьюшке указываем просто
<% 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 -%>
Название:
<%= form.text_field :title %>
<%= form.file_field :uploaded_data %>
<%= form.submit "Отправить" %>
<% end -%>
Отличный способ исчезающей нотификации
<% if flash[:notice] -%>
<% end -%>
<%= 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
то 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]) и работать со страницей, фактически не существующей в корне сайта.
Оказалось, достаточно просто это делается:
в 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
script/plugin discover
вторник, 6 января 2009 г.
Подписаться на:
Сообщения (Atom)