Helper RoR - pytanie o składnie

Cześć, mój pierwszy helper wyświetlający listę biżuterii poniżej. Mam pytanie, czy tak powinien wyglądać? Jak powinno się budować htmla w helperach? Jak można ulepszyć/poprawić mój kod, żeby był porzadny i elegancki?

def jewelry_list(jewelrys)
    result = "<ul class=\"jewellist\">"
    jewel.each do |jewel|
      result += "<li>"
      result += "<a href=\"" + show_jewelry_path(jewelry.url_name, jewelry.id) + "\">"
      result += "<img src=\"#{jewelry.picture}\" alt=\"#{jewelry.name}\" width=\"40px\" />"
      result += "<div>" + jewelry.name + "</div>"
      result += "</a>"
      result += "<div class=\"admin\">Admin: "
      result += link_to('Edit', edit_jewelry_path(jewelry)) + "|"
      result += link_to('Destroy', jewelry, :confirm => 'Na pewno?', :method => :delete)
      result += "</div>"      
      result += "</li>"
    end
    result += "</ul>"
    
    return result
  end
  1. Taki helper generalnie nie robi nic oprócz generowania widoku, można więc przenieść go spokojnie do widoku. Jeśli chcesz użyć tego kodu w więcej niż jednym miejscu, najlepiej skorzystać z partiali. http://apohllo.pl/guides/layouts_and_rendering.html#_u_ywanie_podszablon_w
  2. W helperach dostepna jest metoda content_tag, do generowania htmlowych tagów, możesz się nią zainteresować niemniej przy zagnieżdzaniu dużej ilości elementów robi się strasznie zagmatwane.

Straszny ten kod (sorry), chodzi mi konkretnie o linijki result += “string z surowym htmlem”. Tak jak Olek mówi, zdecydowanie do partiala.

Słyszałem, że generalnie nie powinno się używać operatora + przy operowaniu na łańcuchach znaków, bo to strasznie mało wydajne jest.

Czyli np zamiast:

result = show_jewelry_path(jewelry.url_name, jewelry.id) result += " jakis tekst miedzy" result += link_to('Edit', edit_jewelry_path(jewelry))
Wydajniej jest pisać:

result  = "#{show_jewelry_path(jewelry.url_name, jewelry.id)} jakis tekst miedzy #{link_to('Edit', edit_jewelry_path(jewelry))}"

Prawda li to?

Mi ten kod też się nie podoba :slight_smile: i dokładnie takich rad potrzebuję!!! Dziękuję Wam obydwu.

A do czego w takim razie służą helpery? Chyba, że znacie jakiś tutorial gdzie mogę to znaleźć, w tym co do tej pory znam nie było na ten temat nic.

Hm, nie wiem, czy tylko mi to przeszkadza, ale Twoje pytania zaczynają mnie irytować. Do każdej dupereli zakładasz temat, a wystarczy pomyśleć trochę dłużej i pzynajmniej masz satysfakcję, że rozwiązałaś dany problem sama. Poza tym, proponowałbym napisanie na początek jakiś prostszych aplikacji (żeby ogólnie zapoznać się z frameworkiem)

[quote=tjeden]Wydajniej jest pisać:

result  = "#{show_jewelry_path(jewelry.url_name, jewelry.id)} jakis tekst miedzy #{link_to('Edit', edit_jewelry_path(jewelry))}"

Prawda li to?[/quote]
Wygląda na to, że tak:

Benchmark.bmbm do |x| x.report("+") { 1_000_000.times { t = "ma"; "ala " + t + " kota" } } x.report("<<") { 1_000_000.times { t = "ma"; "ala " << t << " kota" } } x.report("\#{}") { 1_000_000.times { t = "ma"; "ala #{t} kota" } } end

[code]Rehearsal --------------------------------------

  • 1.340000 0.000000 1.340000 ( 1.360110)
    << 1.120000 0.010000 1.130000 ( 1.117372)
    #{} 0.760000 0.000000 0.760000 ( 0.778365)
    ----------------------------- total: 3.230000sec

    user     system      total        real
    
  • 1.340000   0.000000   1.340000 (  1.352892)
    

<< 1.110000 0.000000 1.110000 ( 1.119171)
#{} 0.750000 0.000000 0.750000 ( 0.762927)[/code]

A mnie irytuje Twoja działalność na forum: dziewczyna pisze wyraźnie że się uczy, widać że umie programować tylko jeszcze nie złapała railsowego stylu i konwencji, formułuje swoje pytania w sposób wręcz wzorowy, a Ty się przypieprzasz. Idź gdzie indziej uprawiać swoją zajebistość, podforum “Zielona Szkoła”, jak nazwa wskazuje, nie jest dla takich uber-pro jak Ty.

Uu, widzę, że komuś puściły nerwy. Spokojnie, napisałem co o tym myślę, a Ty się niepotrzebnie rzucasz :slight_smile: Może jestem po prostu trochę przewrażliwiony, ale naprawdę irytują mnie tematy, na które można znaleźć odpowiedź na Google, ruszyć mózgiem przez 5 sekund lub dokładnie wczytać się w książkę/tutorial. Poza tym, jeden rozdział może omawiać dany temat bardzo krótko i niekompletnie, a załóżmy w szóstym jest już to dokłaniej opisane. Denerwuje mnie to, że zamiast doczytać całość i później zadawać pytania, to wielu początkujących od razu wali na forum.

No cóż, nie pozostaje mi nic innego jak kupić sobie książkę, przeczytać pierwszy rozdział, dać sobie w sygnaturze “jestem początkujący” i założyć 5 tematów z prośbą o wyjaśnienie kodów. (:P)

Metody w helperze vs. partiala używasz z reguły kiedy zawiera ona więcej kodu Ruby niż html’a (wyjaśniając prosto).

Ten przykład powyżej nadaje się do partiala. Metody w helperze z reguły to kilka linijek kodu, dzięki którym oszczędzasz wpisywanie tego samego w wielu miejscach w widoku. Z reguły znajdziesz tutaj np. krótkie fragmenty kodu javascript (helpery ajaxowe np.) , wyświetlanie strukturę drzewa, menu czy opcjonalnych linków wszelakiej maści. Często znajdziesz tam rozbudowane if/else albo case lub argumenty opcjonalne. Jeśli nie wiesz czego użyć użyj partiala.