2015-11-27 15 views
12

にレポモジュールを使用する方法私<strong>タグ</strong>モデルのコードでは、私のモデルファイル

schema "tags" do 
    field :name, :string 
    field :parent, :integer # parent tag id 
    timestamps 
end 

def add_error_when_not_exists_tag_id(changeset, params) do 
    tags = Repo.all(Tag) 
    is_exists_tag_id = Enum.reduce(tags, fn(x, acc) -> acc || (x.id === params.parent) end) 
    if is_exists_tag_id, do: changeset, else: add_error(changeset, :parent, "not exists parent!") 
end 

エラー以下の原因。

(UndefinedFunctionError) undefined function: Repo.all/1 (module Repo is not available) 

エラーを修正できますか?

タグのモデルはのネストされたタグモデルです。

タグは親タグを持つことができます。


最終的なコードは以下のとおりです。これはうまく動作します。それは、このモジュールでは使用できないようコントローラ

def create(conn, %{"tag" => tag_params}) do 
    changeset = Tag.changeset(%Tag{}, tag_params) 
    |> Tag.add_error_when_not_exists_tag_id(tag_params, Repo.all(Tag)) 
    // 
    // ... 

答えて

17

でモデル

def add_error_when_not_exists_tag_id(changeset, params, tags) do 
    is_exists_tag_id = Enum.reduce(tags, false, fn(x, acc) -> acc || (Integer.to_string(x.id) === params["parent"]) end) 
    if is_exists_tag_id, do: changeset, else: add_error(changeset, :parent, "The tag is not exists.") 
end 

あなたがRepo変数を使用することはできません。あなたはそれをエイリアスする必要がありますし、あなたのモジュール内で呼び出されます、これはweb.exで自動的に処理されるコントローラで

alias MyApp.Repo 

:しかし

use MyApp.Web, :controller 

、私は強くあなたがRepoの使用を避けることを示唆していますあなたのモデルで。あなたのモデルは純粋であることを意味しています。つまり、副作用があってはならないということです。モデル内の関数を呼び出すには、特定の入力に対して常に同じ出力を持たなければなりません(idempotence)。この例では

あなたはに関数の実装を変更することができます:あなたは、あなたのコントローラでRepo.allを呼び出し、関数にタグを通過できる

def add_error_when_not_exists_tag_id(changeset, params, tags) do 
    is_exists_tag_id = Enum.reduce(tags, fn(x, acc) -> acc || (x.id === params.parent) end) 
    if is_exists_tag_id, do: changeset, else: add_error(changeset, :parent, "not exists parent!") 
end 

。あなたはより多くの複雑な挙動をしている場合

Repo.all

+0

は、詳細な回答ありがとうござい呼び出しと同様の機能を使用していますTagServiceモジュールを作成することを検討!検証ロジックを 'tag_controller.ex'で書きます。なぜなら、私はTagモデルにとってこれまでに他のロジックを持っていないからです。 – 2YY

+0

私は間違いを犯しました...関数として純粋なロジックを 'tag.ex'で書き、コントローラから関数を呼び出そうとします。私はポイントを得た。 'changeset = Tag.changeset(%Tag {}、tag_params)|> Tag.add_error_when_not_exists_tag_id(tag_params)' – 2YY

関連する問題

 関連する問題