2016-11-04 1 views
1

В моем Ruby On Rails 4 (рубин 2.2) приложений, у меня есть внутри зрения:факторизовать рубин письменности на основе константного массива Loop

<%= sanitize(@template.render(
            'text1' => modal['text1'], 
            'text2' => modal['text2'], 
            'text3' => modal['text3'], 
            'text4' => modal['text4'], 
            'image1' => modal['image1'], 
            'image2' => modal['image2'], 
            'image3' => modal['image3'] 
            goes on like this.... 
) 
           ) %> 

Где вы видите выше 'идет в том же духе', это потому, что я woukd нравится факторизовать это и использовать dirctly значений, исходя из этой константы:

MODAL_ELEMENTS = [ "text1", 
         "text2", 
         "text3", 
         "text4", 
         "image1", 
         "image2", 
         "image3", 
         "video1", 
         "video2", 
         "video3", 
         "..." 
           ] 

Я хочу, чтобы найти способ, чтобы изменить то, что внутри дезинфицировать @ template.render так, что рубин перебирает каждый из элементов MODAL_ELEMENTS (text1, TEXT2 , ..) и вводить их как 'text1' => 'text1' => modal ['text1'], 'text2' => modal ['te xt1 '] в коде выше.

Сегодня у меня есть это, но он не:

<%= sanitize(@template.render(
        MODAL_ELEMENTS.each { |element| element => modal[ element ])) %> 

Трудность также в том, что цикл должен добавить каждый кома («»), что мы видим здесь, выделены жирным шрифтом:

„text1“ => модальных [ 'текст1'] ,

'текст2' => модальных [ 'текст2'] ,

...

+0

Что именно вы пытаетесь достичь с этим? – SomeSchmo

ответ

1

Если это просто строка, которую вы хотите, и эта строка вычисляется позже, этот код будет делать

MODAL_ELEMENTS.map{ |element| "'#{element}' => modal[ '#{element}' ]"}.join(", ") 
+0

Нет ли там таких вещей, как закрытие}? – Mathieu

1

Предполагая, что у вас есть хэш имени modal и @template.render также ожидает, что хэш:

MODAL_ELEMENTS.each_with_object({}){ |element, memo| memo[element] = modal[element] } 

Использование #each не будет выводить ничего. Этот массив будет обработан, но не вернет другой массив. Если вы ожидаете вернуть что-то, вы должны использовать #map. Это вернет массив на основе вашего входного массива.

С помощью #inject или #each_with_object вы можете обрабатывать Перечислимый и не ограничиваться выводом массива. В этом примере здесь выдается хеш.

+0

благодарит за вашу помощь. Дело в том, что я не хочу выводить ни хэш, ни массив. Как вы видите в вопросе, я просто хочу вывести: 'text1' => modal ['text1'], 'text2' => modal ['text2'], 'text3' => modal ['text3'] , 'text4' => modal ['text4'], .. нет массива или hash – Mathieu

+0

Oh .. Вы хотели вывести строку. Я думаю, @peter имеет правильный ответ. –

+0

интересный анвр, мне было интересно посмотреть, как производительность между каждым_витом_объектом и инжектором vs каждый ... http: //engineering-blog.alphasights.com/tap-inject-and-each_with_object/#performance – Mathieu

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