Немного Rails трюков

в 8:05, , рубрики: ruby, ruby on rails, tricks, метки: , ,

Немного Rails трюков
Хочу поделиться в вами несколькими трюками, которые помогут сделать работу с Ruby on Rails лучше, быстрее, а также позволят вам много зарабатывать и более лучше одеваться.

1. Routes и запросы в консоли

Запускаем rails console и вызываем метод app: теперь в консоли можно делать то же что и в интеграционных тестах

>> app.class
=> ActionDispatch::Integration::Session

Что это даёт?

Например можно тестировать routes прямо в консоли:

>> app.pages_path
=> "/pages"
>>app.page_path(@page)
=> "/pages/345"

Или делать запросы к нашему Rails application:

>> app.get("/pages/345")
=> 200
>> app.response.body
=> "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'n  ..."

Обо всех методах доступных через app можно почитать тут ActionDispatch::Integration::Session и тут: ActionDispatch::Integration::RequestHelpers

2. Хелперы в консоли

С помощью helper мы можем получить доступ как к встроенным в Rails хелперам:

>>helper.mail_to "me@et.you"
=> "<a href="mailto:me@et.you">me@et.you</a>

>>helper.pluralize(2,'bug')
 => "2 bugs"

так и к своим:

def give_me_blog_link
  <a href='myblog.com'>Blog</a>
end
>> helper.give_me_blog_link
=> "<a href='myblog.com'>Blog</a>

Но что делать когда в нашем хелпере используется instance variable (например client)?

def os_adviser
   if @client.geek?
     'free bsd'
   elsif @client.blond?
     'mac os'
   else
     'windows'
   end
end

Проблему можно решить воспользовавшись Object#instance_variable_set

>> helper.os_adviser :@client, Client.first
=> #<Client id: 3034, ...

>> helper.os_adviser
=> "windows"

Ок, а что если хелпер использует данные из params?

def do_you_want_meat
   params['meat'] ? 'О да, стейк с кровью!' : 'Нет, спасибо, мне бы фруктов'
end

В этом нам поможет небольшой хак:

>>helper.controller = OpenStruct.new( { :params => {} } )
=> #<OpenStruct params={}> 
>>helper.do_you_want_meat
=> 'Нет, спасибо, мне бы фруктов'

>>helper.controller = OpenStruct.new( { :params => { :meat => true } } )
=> #<OpenStruct params={:meat=>true}> 
>>helper.do_you_want_meat
=> 'О да, стейк с кровью!'

3. Безопасные изменения в консоли

Если вы запускаете консоль чтобы что-то протестировать на production сервере, есть опасность ненароком удалить или изменить данные в базе. Чтобы этого избежать можно воспользоваться запуском консоли с опцией --sandbox

>>rails r 'puts User.last.name'
=> 'Fedor'
>>rails c
>>user = User.last
>>user.name = "Petr"
>>user.save
>>user.name
=> "Petr"
>>exit
>>rails r 'puts User.last.name'
=> 'Fedor'

4. Удаление элемента из хэша по ключу

Удобная штука, интересно, появится ли это в Ruby.

>>options = {:color => 'black', :size => 'medium', :city => 'London'}
=>{:color => 'black', :size => 'medium', :city => 'London'}
>>options.except!(:city)
=>{:color => 'black', :size => 'medium'}

5. Поиск подстроки в строке

Обычно это делается с помощью

>>string = 'corvalol'
>>string =~ /lol/
=> 5 # позиция в строке где найдено совпадение

Альтернативный способ, на мой взгляд несколько грациознее

>>string = 'corvalol'
>>string['lol']
=> 'lol' # если найдено совпадение, возвращает его

Это только 5 фишек, которые показались мне интересными, по ссылкам ниже их гораздо больше.

confreaks.com/videos/889-railsconf2012-ten-things-you-didn-t-know-rails-could-do
37signals.com/svn/posts/3176-three-quick-rails-console-tips
rubyreloaded.com/trickshots/
stackoverflow.com/questions/151030/how-do-i-call-controller-view-methods-from-the-console-in-rails

Автор: naezdnik

* - обязательные к заполнению поля