2013-07-17 5 views
0

나는 다음과 같은 코드가 있습니다# {}에서 명명 한 변수를 만드시겠습니까?

3.times do |n| 
    "project#{n}" = FactoryGirl.create(:project, :title => "Project #{n}") 
end 

을 그건 분명히 작동하지 않습니다 ... 아무도 내가 많이 만들기 위해 '로컬 루프 변수'로 변경됩니다 변수 이름을 만들 수 있습니다 루프를 만드는 방법을 알고 있나요 project1, project2, projekt3와 같은 변수는?

+2

참조 : http://stackoverflow.com/questions/3864488/dynamically-creating-local-variables-in-ruby –

+1

구체적으로 * 무엇을하려고하십니까? 임의의 변수를 생성하는 것은 소스 코드가 (a) 공장 수에 따라 변경해야하거나 (b) 동적으로 생성 된 이름으로 항상 'send'를 사용하기 때문에 조금 바보 같습니다. 점은 무엇인가? ** 또한 **, [Factory Girl에는 시퀀스가 ​​있습니다.] (https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#sequences) 이미 수동으로 수행 할 필요가 없습니다. –

+0

가장 좋은 방법은 array를 사용하고'FactoryGirl.create_list (: project)'에 의해 생성하는 것입니다. – Hauleth

답변

6

해시를 사용할 수 있습니까? 당신은 project[1]와 데이터에 액세스 할 수

project = {} 
3.times do |n| 
    project[n] = FactoryGirl.create(:project, :title => "Project #{n}") 
end 

...

+3

다른 키/값 쌍을 사용하는 해시는 변수 * 더미 패턴보다 더 쉽게 작업 할 수 있습니다. 이 경우 키가 항상 숫자이기 때문에 '배열'도 더 좋을 것입니다. – tadman

+0

그리고 설탕'project [ "project # {n}". to_sym] = ....을 원한다면 프로젝트 [: project1], 프로젝트 [: project2] 등으로 액세스 할 수 있습니다. – Doon

4

크 누트 제안과 같이, 해시를 사용할 수 있습니다, 또는 당신이 배열을 사용할 수 있습니다 - 당신은 0에서 시작하여 위쪽으로 연속적으로 이동하고 있기 때문에 .

project = Array.new(3) 
3.times do |n| 
    project[n] = FactoryGirl.create(:project, :title => "Project#{n}") 
end 

또는, 더 간단하게 :

project = [] 
3.times do |n| 
    project << FactoryGirl.create(:project, :title => "Project#{n}") 
end 
1

이것은 당신이 요구하는지의 환상을 제공합니다 ...

eigenclass = class << self; self; end 
3.times do |n| 
    eigenclass.class_eval { attr_accessor "project#{n}" } 
    eval "self.project#{n} = FactoryGirl.create(:project, :title => \"Project #{n}\")" 
end 

그러나이 작업을 수행하지 마십시오. 실제로 n의 각 값에 대해 하나씩 Kernel에 속성 접근자를 만듭니다.

Here 내 참조.

관련 문제