2017-10-18 5 views
0

私は作成するために渡された次の作成パラメータを持っています!何かが見つからない場合、create paramsから正確なエラーを返す方法

def create_params 
    params.permit(
     :param1, 
     :param2, 
     :param3, 
     :param4, 
     :param5 
    ) 
    end 

コントローラ

def create 
    something = Model.create!(create_params) 
    end 

テーブル内のすべての列がNULLではありません。したがって、私がパラメータのいずれかを渡さないと、次のようなエラーが発生します。

Mysql2::Error: Field 'col5' doesn't have a default value: INSERT INTO `table` (`col1`, `col2`, `col3`, `col4`) VALUES ('value1', 'value2, 'value3', 'value4') 

しかし、正確なエラーメッセージが表示されません。どのように有効なエラーメッセージを返すことができますか?

答えて

1

NOT NULLのようなデータベースレベルでの検証があるとよいでしょう。 しかし、DBによって発生したエラーをキャッチすることは可能ではなく、信頼性もありません。 良いエラーメッセージが必要な場合は、ActiveRecordのレベルで検証してください。

class Model < ActiveRecord::Base 
    validates :param1, :param2, :param3, :param4, :param5, presence: true 
end 

class ModelsController < ApplicationController 
    def create 
    model = Model.new(create_params) 

    if model.save # returns true or false 
     # ... do something 
    else 
     # ... model.errors is a collection that holds errors 
     model.errors 
    end 
    end 
end 
+0

'Model.create'は、データベースにレコードを作成しようとします。より良い方法は 'model = Model.new(create_params)'です。それで 'model.save'が理にかなっています。 –

+0

そのため、モデルで検証チェックを追加すると、コントローラーでcreateアクションとupdateアクションを追加した場合、すべてのパラメーターが必要なくなってしまいます。 –

+1

@Nicholasjamesはい、可能です:http://guides.rubyonrails.org/active_record_validations.html#on – unkmas

関連する問題