Проблема рефакторинга в Rails 3 - PullRequest
0 голосов
/ 04 января 2011

Следующий код представления генерирует серию ссылок с итогами (как и ожидалось):

<% @jobs.group_by(&:employer_name).sort.each do |employer, jobs| %>
    <%= link_to employer, jobs_path() %> <%= "(#{jobs.length})" %>
<% end %>

Однако, когда я реорганизую код представления и перенесу логику в помощник, код не будет работать должным образом.

вид:

<%= employer_filter(@jobs_clone) %>

помощник:

def employer_filter(jobs)
    jobs.group_by(&:employer_name).sort.each do |employer,jobs|
        link_to employer, jobs_path()
    end   
end

Создается следующий вывод:

<Job:0x10342e628>#<Job:0x10342e588>#<Job:0x10342e2e0>Employer A#<Job:0x10342e1c8>Employer B#<Job:0x10342e0d8>Employer C#<Job:0x10342ded0>Employer D#

Что я не понимаю? На первый взгляд код кажется эквивалентным.

Ответы [ 2 ]

1 голос
/ 04 января 2011

В первом примере он напрямую выводится в erb, во втором - возвращает результат этого метода.

Попробуйте это:

def employer_filter(jobs)
    employer_filter = ""
    jobs.group_by(&:employer_name).sort.each do |employer,jobs|
        employer_filter += link_to(employer, jobs_path())
    end   
    employer_filter
end

Тогда назовите это следующим образом:

raw(employer_filter(jobs))

Также обратите внимание на использование «raw». После того, как вы переместили генерацию строки из шаблона, вы должны сказать rails, что вы не хотите, чтобы html избежал.

Для дополнительной оценки вы могли бы использовать команду "inject" вместо явного построения строки, но я ленив и хотел бы дать вам то, что, как я знаю, будет работать без тестирования.

0 голосов
/ 05 января 2011

Этот синтаксис работал так, как я надеялся:

def employer_filter(jobs_clone)
    jobs_clone.group_by(&:employer_name).sort.collect { |group,items|
        link_to( group, jobs_path() ) + " (#{items.length})"
    }.join(' | ').html_safe
end
...