2011-01-04 2 views
0

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

<% @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# 

Что я не понимая? Сначала краснеть, код кажется эквивалентным.

ответ

0

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

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 
1

В первом примере он непосредственно выводит на 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)) 

отметить также использование "сырой". После того, как вы переместите генерацию строки из шаблона, вам нужно указать рельсы, что вы не хотите, чтобы html был экранирован.

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

+0

Закрыть. Он возвращает значения, такие как Employer A вместо фактической ссылки. Мне было бы интересно увидеть синтаксис .inject. Поддерживает ли OrderedHash (из которых это один) метод .collect? – craig

+0

Что означает «фактическая ссылка»? –

+0

Вместо ссылки тег привязки отображается, как описано выше, как текст. Я думаю, что это называется «сбежавшим». – craig

Смежные вопросы