2012-06-06 5 views
0

Учитывая следующий вспомогательный метод.Как я могу реорганизовать этот метод?

def link_tags(collection) 
    tags = collection.split(',') 

    tags.map.each do |tag| 
    if tag == tags.last 
     content_tag(:a, tag, href: tags_filter_post_path(tag)) 
    else 
     content_tag(:a, tag, href: tags_filter_post_path(tag)) + ', ' 
    end   
    end.reduce(:<<) 
end 

Как я могу сделать небольшой рефакторинг на этом?

EDIT: окончательный код после предлагаемого рефакторинга.

def link_tags(collection) 
    collection.split(',').collect do |tag| 
    link = "" 
    link += link_to tag, tags_filter_post_path(tag) 
    end.join(', ').html_safe 
end 
+0

Почему вы вызываете 'each' на' map'? –

+0

Вопросы проверки кода принадлежат [CodeReview.SE] (http://CodeReview.StackExchange.Com/). –

+0

@ JörgWMittag Спасибо, не знали о CodeReview.SE;) –

ответ

5
def link_tags(collection) 
    collection.split(',').map do |tag| 
    link_to tag, tag_filter_post_path(tag) 
    end.join(', ') 
end 
+0

Не думал, чтобы изменить его на' link_to'-nice (+1). Я решил оставить переменную 'tags', так как я чувствую, что она помогает добавить какой-то контекст в происходящее, но, очевидно, это все субъективно. –

+0

Лучший на мой взгляд. Я бы просто переключил '.map' на' .collect', так как я думаю, что это имеет смысл. : P –

+0

Я согласен с тем, что '.collect' яснее, хотя я вижу, что' .map' используется намного чаще и является методом, который должен знать каждый программист Ruby. –

1

Используйте join вместо отводом вокруг с обработкой последнего элемента специально (что также не будет работать так, как вы делаете это, если эти элементы не являются уникальными), а затем конкатенацию после. Вызов each также является избыточным.

def link_tags(collection) 
    tags = collection.split(',') 
    tags.map do |tag| 
    content_tag(:a, tag, href: tags_filter_post_path(tag)) 
    end.join(', ') 
end 
+0

выходы: 'important, test как текст, а не ссылка, как я желаю. –

+0

с использованием '.reduce (: <<)' решает эту проблему, но, похоже, не работает с 'join' –

0

Попробуйте (с link_to как предложил хпМ):

def link_tags(collection) 
    collection.split(',').each {|tag| link_to tag, tag_filter_post_path(tag)}.join(', ') 
end 
Смежные вопросы