2016-09-03 9 views
0

Sinatra를 사용하여 만든 작은 웹 응용 프로그램을 사용하고 Slim 템플릿을 사용합니다. 내 functions.rb 파일에 $locations이라는 해시를 정의했으며 해시 값을 반환하는 함수를 사용하려고합니다. 여기에 내가 무엇을 가지고 :Sinatra 및 Slim return Ruby 함수

# functions.rb 
$locations = Hash[ 
    'wa' => Hash[ 
    'capital' => 'Olympia' 
    ], 
    'or' => Hash[ 
    'capital' => 'Salem' 
    ] 
] 
def foobar 
    $locations.each do |key, value| 
    $locations[key]['capital'] 
    end 
end 

내 슬림 파일 렌더링

/ layout.slim 
div#capitals = foobar 

페이지는 수도의 ID와 사업부가 있지만 내용은 괄호로 인쇄 단지 전체 해시입니다. each do의 내부를 puts $locations[key]['capital']으로 변경하고 명령 줄에서이 기능을 실행하면 완벽하게 작동합니다. Sinatra에서 어떻게 작동합니까?

기본적으로, 내가 대신 루비이 PHP 스크립트를 달성하고 싶다 (내 스크립트 어디에서나 함수를 호출 할 수 있어야하고, 그것이 <div> 태그를 인쇄이) : 루프에서

<?php 
$locations = array(
    'wa' => array(
    'capital' => 'Olympia' 
), 
    'or' => array(
    'capital' => 'Salem' 
) 
); 

function foobar($array) { 
    foreach ($array as $key => $value) { 
    echo "<div>" . $array[$key]['capital'] . "</div>"; 
    } 
} 
foobar($locations); 
+1

Ruby의 변수 접두사로 '$'는 (는) 전역 변수 *를 의미하며 이는 사용하지 않는 것이 좋습니다. 이것을 'LOCATIONS'와 같은 상수로 선언 해보십시오. – tadman

+1

@tadman이 의견에 감사드립니다. Ruby의 변수에 대해 더 많이 연구하게되었으므로 코드를 개선 할 수있었습니다. –

답변

2

, value해당 키의 해시는입니다. 또한 대문자를 호출자에게 반환하려고합니다. #each은 요소를 열거하지만 각 반복에서 블록이 반환 한 값이 아니라 컬렉션을 반환합니다. 당신이 뭔가를 원하는이 날 것으로 보인다 나는 슬림 많이 모르지만, 당신의 PHP의 예에 따라 :

def foobar 
    $locations.map do |_key, value| 
    value['capital'] 
    end 
end 

또는 :

def foobar 
    $locations.values.map do |value| 
    value['capital'] 
    end 
end 

UPDATE를 당신은 #map (또는 #collect를) 원하는 :

- for capital in foobar 
    div= capital 
+0

도움을 주셔서 감사합니다. 무슨 일이 일어나고 있는지 더 잘 이해하고 있습니다. 그러나, 그것은 내가 예상했던 것과 다른 것처럼 보인다. 궁극적으로 해시에 대문자를 저장하고이 함수를 사용하여 내부에 각각의 대문자와 함께 '