まず、いくつかの背景:
私はCompany
モデル、モデル、モデルProject
を持っていTask
ます。プロジェクトは会社に属し、タスクはプロジェクトに属します。
Project
モデルにはいくつかの属性があります: company_id, date
. これらの属性は、プロジェクトを一意に識別します
プロジェクトを識別するために必要な詳細を含む URL に POST することにより、ユーザーが API によってタスクを作成できるようにしています。例えば:
POST /projects/<comnpany_name>/<date>/tasks/
ユーザーの生活を楽にするために、指定された詳細のプロジェクトがない場合、指定された詳細でその場でプロジェクトを作成し、タスクを作成してプロジェクトに割り当てたいと思います。
...そして私の問題は次のとおりです。
プロジェクトの作成に問題がある場合、会社名が無効であるとしましょう。エラー メッセージを返し、ユーザーに伝える正しい方法は何ですか?
私が何を意味するかを説明します:私はにcreate_by_name_and_company_name
メソッドを追加しましたProject
:
def self.create_by_name_and_company_name(name, company_name)
if company = Company.find_by_name(company_name)
project = Project.create(company_id: company.id,
name: name)
else # cannot create this project, trying to communicate the error
project = Project.new(name: name)
project.errors.add(:company, 'must have a valid name')
end
company
end
エラーが設定された保存されていないCompanyオブジェクトを返すことで、エラーを伝える良い方法になることを期待していました(これは、検証エラーが発生した場合のレールの動作に似ています)。
問題は、会社オブジェクトを呼び出すvalid?
と、そこに書いたエラーが削除され、通常の検証エラーが追加されることです (この場合、会社を空白にすることはできません)。
そしておまけの質問…
また、概念的な問題もあります。実際の属性を作成するために使用されるパラメーターを提供してモデルを作成しているため、それらが常に errors[:attr] ハッシュに適切にマップされるとは限りません。この場合はそれほど悪くなく、company name
パラメーターに company フィールドを使用していますが、create メソッドに提供されたパラメーターがモデル属性にあまり似ていない場合、これはより厄介になる可能性があると思います。
では、その問題に取り組むための好ましいアプローチは何ですか? そのアプローチに基本的に何か問題がありますか?もしそうなら、好ましいアプローチは何ですか?