2011-10-03 2 views
5

나는여러 인스턴스 변수를 루비로 해시로 변환하는 더 나은 방법은?

#<Response:0x000... @first = "Charlie", @last=Kelly, .... 

의 형식으로 응답을 받고 있어요 나는 (활성 상인을위한) 해시이 점을 설정해야합니다. 현재 내가 변수를 통해 반복하고이 일을하고있다 :

이 작동
response.instance_variables.each do |r| 
    my_hash.merge!(r.to_s.delete("@").intern => response.instance_eval(r.to_s.delete("@"))) 
end 

, 그것은 {:first = "charlie", :last => "kelly"} 를 생성합니다,하지만 조금 해키 불안정 보인다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

편집 : 방금 방정식의 두 번째 부분에 instance_variable_get을 사용할 수 있다는 것을 알았지 만 여전히 주요 문제를 남깁니다.

답변

9

레일즈는 이라는 메소드를 가지고 있습니다. 여기에 code on GitHub이 있습니다.

class C 
    def initialize(x, y) 
    @x, @y = x, y 
    end 
end 

C.new(0, 1).instance_values # => {"x" => 0, "y" => 1} 
C.new(0, 1).instance_values.symbolize_keys # => {:x => 0, :y => 1} 
+0

문자열 대신에 첫 번째 값을 강제로 사용할 수있는 방법이 있습니까? 이 코드를받는 코드를 만질 수없고 문자열이 작동하지 않습니다. – cbron

+0

확실히,'.symbolize_keys' :'obj.instance_values.symbolize_keys'가 여러분을 가야합니다! –

+0

Aww 완벽한 남자. 나는 instance_values ​​메소드를 다시 작성하기 시작했으나 이것은 쉬운 방법이다. 그레지. – cbron