2016-04-15 8 views
1

ウェブフォームからのすべての値は文字列です。フィールドにkindがあり、データ型が整数のクラスAnnouncementがあります。モデルクラスでは、enumを定義します。Rails一意の整数値の代入フォームから

enum kind: { 
    event: 1, 
    feature: 2 
} 

大量割り当てについて一般的に問題はありません。問題は、私がこれをしているときに、'1' is not a valid kindについて文句を言うことになります。それは整数ではない文字列だからです。

announcement=Announcement.new(announcement_params) 

手動でフィールドの値を設定する以外は、この問題の解決方法はありますか? は答えはちょうど私の心に来て、あなたに

+0

移行中の種類のフィールドのデータ型は何ですか? – uzaif

+0

と 'announcement_params'メソッドが公開されています – uzaif

+0

@uzaifそれはintです –

答えて

0

をありがとう、これは私が

kind=params[:announcement][:kind].to_i 
params[:announcement].delete(:kind) 
params[:announcement].merge(kind: kind) 
  1. 問題を解決するために何をすべきかであるkindを削除kindのparamを取得し、整数
  2. に変換パラメータの文字列です
  3. 新しいkindをパラメータにマージします

そして最後は、質量割り当て

のためのホワイトリストのパラメータであるが、このように、あなたがあなたAnnouncementモデルにkind属性用セッターを再定義することができます

0

@uzaifありがとう:

# app/models/announcement.rb 
def kind=(value) 
    super(value.to_i) 
    # or 
    # super(Integer(value)) 
end 

これは、指定された値を最初にintegerに変換し、次にenumで定義された元のメソッドを呼び出します。ただし、to_iは、数字以外のもの、つまりnilを変換します。これらは0に変換されます。したがって、定義された列挙値の中で0を使用しないでください。Integer(value)フォームを使用してください。数字以外の場合やnilの例外が発生します。

セッターが再び質量割り当てることができます:

Announcement.new(kind: '1') # should be OK 
関連する問題