IO.puts "validating #{member_of_field} is one of #{inspect allowed_values}" ret = validate_inclusion(model_or_changeset, member_of_field, allowed_values) IO.inspect ret
validating type is one of ["web_server", "db"]%Ecto.Changeset{changes: %{}, errors: [], filters: %{}, model: %MyProject.DB.Models.ProductComponent{__state__: :built, id: nil, inserted_at: nil, name: "woah now", product: #Ecto.Association.NotLoaded<association :product is not loaded>, product_component_options: #Ecto.Association.NotLoaded<association :product_component_options is not loaded>, product_id: 73, type: "crazy junk", updated_at: nil}, optional: [], params: %{}, repo: nil, required: [:product_id, :name, :type], valid?: true, validations: [type: {:inclusion, ["web_server", "db"]}]}
--
You received this message because you are subscribed to the Google Groups "elixir-ecto" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elixir-ecto...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-ecto/663aa171-4975-44ac-9758-b426b5ca8900%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
defmodule MyProject.DB.Models.BaseModel do
defmacro __using__(_opts) do quote do use Ecto.Model
def changeset(model_or_changeset, params \\ %{}) do ret = cast(model_or_changeset, params, @required_fields, @optional_fields) validate_member_of(ret, params, @member_of_fields) end
defp validate_member_of(model_or_changeset, params, []), do: model_or_changeset defp validate_member_of(model_or_changeset, params, [{member_of_field, allowed_values} | tail]) do
IO.puts "validating #{member_of_field} is one of #{inspect allowed_values}" ret = validate_inclusion(model_or_changeset, member_of_field, allowed_values) IO.inspect ret
validate_member_of(ret, params, tail) end
def vinsert(model) do my_changeset = changeset(model) case my_changeset.valid? do true -> {:ok, MyProject.Repo.insert(model)} false -> {:error, my_changeset.errors} end end end endend
defmodule MyProject.DB.Models.ProductComponent do @required_fields [:product_id, :name, :type] @optional_fields [] @member_of_fields [{:type, ["web_server", "db"]}] use MyProject.DB.Models.BaseModel
test "validate - fail to create component with invalid type", context do component = %ProductComponent{product_id: context[:product].id, type: "crazy junk", name: "woah now"}
{status, errors} = ProductComponent.vinsert(component) assert status == :error assert Keyword.has_key?(errors, :type) end
To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-ecto/b095702e-fec4-4afe-8814-a43a592da92b%40googlegroups.com.