2011-01-25 7 views
3

처리를 위해 컨트롤러에 전달되는 상당량의 params가있는 양식이 있습니다. 서로 다른는 params를 비슷한 방식으로 이름이 지정됩니다의 '설정'레일 : params 해시를 동적으로 반복하여 존재하는지 확인하십시오.

setname1_paramname 
setname1_paramname2 

을 지금, 나는이 모든 필드가 제출되었는지 확인하기 위해 이러한 '세트'중 하나를 확인해야합니다. 바로 지금, 내가 또는 스타일의 진술하면 수동으로이 일을 해요 :

if setname1_paramname.blank? || setname1_paramname2.blank? || ...etc 
    @object.errors.add_to_base("All setname1 fields are required."). 
    render :action => 'new' 
    return false 
end 

는 방법이 PARAMS 이상에 프로그래밍 루프 있는가, 그리고 @object 오류에 추가?

감사합니다.

+0

하는 Railscast on Multistep Forms을 찾을 수 있습니다 : 다음, 루프 내에서, 당신은 검증 모든 종류의 작업을 수행 할 수 있습니다 시리즈와 같은 논리 순서? 다른 말로하면 setname1_paramname3 및 setname1_paramname4와 같은 다음 단어가 있습니까 – apneadiving

+0

아니요, 불행히도 결제 정보이므로 billing_address, billing_state 등과 같습니다. –

+2

컨트롤러에서 사용하는 것은 좋지 않습니다. ** 비즈니스 논리를 모델에 유지하는 것이 좋습니다 **. – edgerunner

답변

9

params가 많은 것처럼 들리며 params 그룹에 대한 검사를 수행 할 필요가있는 것처럼 보였으므로 어쩌면 이와 같은 것이 유용할까요? 기본적으로 params 해시를 반복하고 정규 표현식을 사용하여 매개 변수 집합을 대상으로 지정합니다.

당신이 필요로하는 것은 내가 의심으로 여러 단계의 형태 인 경우
params.each do |key, value| 
    # target groups using regular expressions 
    if (key.to_s[/setname1.*/]) 
    # whatever logic you need for params that start with 'setname1' 
    if param[key].blank? 
     @object.errors.add_to_base("All setname1 fields are required."). 
    end 
    end 
end 
+0

레일 'starts_with?'를 사용할 수 있습니까? 문자열 메서드는 여기에? –

+1

네, 그게 효과가 있다고 생각합니다. 나는 다음을 수행하여 irb에서 테스트했다 :'active_support '를 요구하고 나서'active_support/core_ext''를 요구하고''test123 ".starts_with? ("test ")'# => true. 그리고 나서 :''test123 ".starts_with? ("false ")'# => false – Upgradingdave

1

일시적이라 할지라도이 정보를 모델에 저장하지 않고 단순히 레일 검증을 사용하는 이유가 있습니까?

+0

나는 논리를 모델에 유지하는 것을 선호하지만,이 특정 필드의 존재를 더 많은 조치가있을 때까지 문제의 모델을 저장하지 않고 추가 조치의 "게이트웨이"의 일종으로 확인해야합니다. 불행히도 상속 된 코드로 작업하고 있으며 프로세스를 너무 많이 변경할 수 없습니다. –

+0

추가 작업의 종류는 무엇입니까? 이 모델에 저장할 수있는 것이 있습니까? 그러면 모델이 저장되면 두 번째 단계에서 옵션으로 추가 작업이 지연됩니까? 예를 들어 모델을 저장하고 편집 페이지로 리디렉션합니다. 정보가 체크 아웃되면 편집 페이지에서 다른 양식이나 일련의 작업을 나열하십시오. –

+0

모델 **은 유효성 검사에 실패하면 ** 저장하지 않습니다. – edgerunner

6

이름이 임의로 선택되는 경우 모델에서 가상 속성을 만들고 Rails가 존재 확인을 처리하도록 할 수 있습니다.

class SomeModel < ActiveRecord::Base 
    VIRTUAL_ATTRIBUTES = [:billing_address, :billing_state, :something_else] 
    attr_accessor *VIRTUAL_ATTRIBUTES 
    validates_presence_of *VIRTUAL_ATTRIBUTES 
    … 
end 
+0

매우 우아함 :) – apneadiving

0

나는 녹슬하지만 폼 요소에서 오는대로 내가 예, 값이 비어있는 경우에도 PARAM 여전히만큼 PARAMS 해시 반환 될 것 같은데요? params 해시를 반복하고 빈 값이 아닌 값의 카운터를 유지 한 다음 params 해시의 길이를 카운터와 비교할 수 있습니다. 카운터가 짧으면 빈 매개 변수가 있고 각 매개 변수의 검사를 하드 코드하지 않아도 오류를 처리 할 수 ​​있습니까?

0

, 당신은 당신의 PARAMS가 있습니까 유용 할

관련 문제