Parallel Effects On Rails

За да подобря usability-то в един от rails проектите си, ползвам интензивно scriptaculous поради няколко причини:

  • Първо, библитеката е налична във всяка версия на rails и от ваша страна не се налага да извършвате никакви действия за да я подкарате да работи.
  • Второ, библиотеката има широк кръг потребители, документирана е отлично и е също толкова добре поддържана.
  • Трето, интеграцията й с prototype.js е пословична и в rails има готови helper-и за ползването й.

Преглеждайки документацията на scriptaculous вчера, попаднах на странно изключение – ефекта Parallel, който е единственият, който не приема DOM елемент като първи параметър, а вместо това използва масив от ефекти.

След половинчасово ръчкане на visual_effect от ScriptaculousHelper стигнах до извода, че вариант да подкарам този ефект под rails с готовите helper-и няма, което значи, че ще трябва да ползвам собствен. Затова в ApplicationHelper-а добавих следното:

def parallel_effects(effects,options)
  effects.each_with_index do |e,id|
    effects[id]=e[0,e.length-1] if e[-1,1]==";"
  end
  effect_list='[' + effects.join(', ') + ']'
  options_list='{' +
  options.map { |k,v| "#{k}:#{v}" }.sort.join(', ') + '}'
  begin
    record "new Effect.Parallel(#{effect_list},#{options_list})"
  rescue 
    "new Effect.Parallel(#{effect_list},#{options_list})"
  end
end

Използването на record зависи от контекста – ако ползвате helper-a в RJS template или inline RJS, ще бъде извикан метода record и съдържанието на string-а ще бъде предадено на page, което е еквивалентно на:

page << "somestring"

В противен случай ще бъде пуснат Exception за невалиден метод, прехвърляйки управлението в rescue блока, което позволява да използвате същия helper и в RHTML teplate, или при извикване на неща от сорта на link_to_remote или function_to_remote

Ето и пример за използване на helper-a:

# Using it in RJS
<%= link_to_function('Show more', nil, :id=>"more") do |page|
page.parallel_effects([
visual_effect(:blind_up,'content1'),
visual_effect(:blind_down,'content2')
],:duration=>0.5)
end %>
 
# Using it in RHTML
<%= link_to_remote("Again some shrinking",
:url=>{:action=>:list}, :update=>'content1',
:complete=>parallel_effects([
visual_effect(:blind_up,'content2'),
visual_effect(:blind_down,'content1')
],:duration=>0.5)) %>

Маркери: ,

За тази статия



Категории