0

まず、いくつかの背景:

私は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 メソッドに提供されたパラメーターがモデル属性にあまり似ていない場合、これはより厄介になる可能性があると思います。

では、その問題に取り組むための好ましいアプローチは何ですか? そのアプローチに基本的に何か問題がありますか?もしそうなら、好ましいアプローチは何ですか?

4

2 に答える 2

1

デフォルトの Rails 検証エラー メッセージのオーバーライドについては、検証制約を次のように記述する必要があります。

validates_presence_of :name, :message => "must be a valid name"
于 2012-07-12T21:08:45.937 に答える
0

このような入れ子を避けて、より浅い API に固執するのが最善であると考えています。

于 2012-07-30T16:08:46.843 に答える