2014-08-31 3 views
6

레일 4로 열거 형을 사용하여 처음으로 몇 가지 문제가 발생하여 더러운 솔루션을 염두에두고 거기에 더 멋진 솔루션이 있는지 확인하고 싶습니다.레일 4 열거 형 유효성 검사

create_table :shippings do |t| 
    t.column :status, :integer, default: 0 
end 

내 모델 :

class Shipping < ActiveRecord::Base 
    enum status: { initial_status: 0, frozen: 1, processed: 2 } 
end 

그리고 내가보기에이 비트가 (에 대한 간단한 양식을 사용) :

이 내 테이블 마이그레이션 관련 부분입니다 내가 양식을 작성 제출하고 내가 얻을이 유효성 검사 오류 액션 불을 만들 때

def create 
    @shipping = Shipping.create!(shipping_params) 

    if @shipping.new_record? 
     return render 'new' 
    end 

    flash[:success] = 'Shipping saved successfully' 
    redirect_to home_path 
    end 

private 

    def shipping_params 
    params.require(:shipping).permit(... :status) 
    end 

그래서 : 그래서 내 컨트롤러

= f.input :status, :as => :select, :collection => Shipping.statuses, :required => true, :prompt => 'Please select', label: false 

그래서

'1' is not a valid status 

을 나는 문제가 있음을 알고 있다고 생각 데이터 유형이므로이 비트를 모델에 추가했습니다.

그러나 이것은 아무 것도하지 않는 것 같은데 어떻게 해결할 수 있습니까? 비슷한 경험을 가진 사람이 있습니까?

답변

3

here 솔루션을 찾을 수 있습니다.

기본적으로 정수가 아닌 문자열 ('initial_status', 'frozen'또는 'processed')을 전달해야합니다. 즉, 양식은 다음과 같이해야합니다 : 당신은 당신의 형태로 statuses.keys을 수행하여이를 달성 할 수

<select ...><option value="frozen">frozen</option>...</select> 

. 또한 (나는) 당신이 before_validation을 필요로하지 않는다고 믿습니다.

선택적으로,이 같은 검증을 추가 할 수 있습니다

validates_inclusion_of :status, in: Shipping.statuses.keys 

을하지만, 나는이 유효성 검사가 의미가 있는지 모르겠어요 상태로하면 ArgumentError (see this를) 제기 잘못된 값을 할당하려고하기 때문이다.