2016-12-14 3 views
3

나는, 나는 이런 식으로 그들에게 두 가지 모델 사용자 및 주소와 임베디드 연결을 연결 한 :체외 필터 빈 기록

defmodule App.Address do 
    # ... 

    def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:address, :city]) 
    end 
end 

내가 사용하는 경우 :

inputs_for :addresses, [append: [App.Address{}]], fn address -> 
    text_input address, :address, class: "" 
end 

나는 빈 데이터를 입력, 그것은 nil로 저장됩니다. 빈 데이터를 걸러 내고 저장하지 못하도록하는 솔루션을 기대하고 있습니다. 내가 생각한대로 Controller에서 Enum.filter를 사용하고 있습니다.

모델 유효성 검사 또는 컨트롤러에서 더 깨끗한 방법을 사용하면 더 깨끗한 방법이 있습니까?

+0

[cast_embed/3] (https://hexdocs.pm/ecto/Ecto.Changeset.html#cast_embed/3) 함수는 레일스 [accepts_nested_attributes_for]와 유사한 방식으로': reject_if'와 같은 옵션을 하나 더 받아 들여야한다고 생각합니다 (http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html). [필자는 elixir-ecto 메일 링리스트에 질문을 올렸습니다.] (https://groups.google.com/forum/#!topic/elixir-ecto/ScPo16tfllc) –

+0

@OleksandrAvoyants 이는': with' 옵션의 요점입니다 . 유효하지 않은 경우이를 거부 할 수있는 변경 집합을 지정합니다. –

+0

@JustinWood 내가 틀렸다면 나를 바로 잡으십시오. 그러나 저는 현재 changeset가 레코드를 거부 할 방법이 없다고 생각합니다. –

답변

0

변경 집합에 대한 유효성 검사를 원할 것입니다.

def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:address, :city]) 
    |> validate_required([:address, :city]) 
end 

이의 라인을 따라 뭔가 데이터가 열 addresscity에서이 있는지 확인합니다. 없는 경우 레코드가 저장되지 않습니다. 내가 제대로, 당신이 Phoenix.Controller.scrub_params/2 찾고 될 수있는 질문을 이해하면

당신은 검증과 제약 in the docs

+0

답장을 보내 주신 Justin에게 감사드립니다. 주소는 필수 항목 일 필요는 없습니다. 주소 필드가 설정되지 않았 으면 오류를 발생시키지 않고 db에 저장되지 않습니다. – kayne

+0

'insert!/2'를 사용하지 않으면 에러가 발생하지 않습니다. 'insert/2'를 사용하면'{ok, struct}'또는'{: error, changeset}'를 반환합니다. 아무 것도 제기되지 않고 값을 반환하고 원하는대로 할 수 있습니다. –

+0

예, 그렇지만 여전히 사용자 모델의 유효성을 검사해야하므로 해당 모델의 오류를 catch 할 수 있어야합니다 (User) – kayne

0

에 대한 자세한 내용을보실 수 있습니다. 문서에서

은 위에 링크 :

이 기능은 HTML 양식을 통해 전송 빈 문자열을 제거하는 데 유용합니다.

this SO question 또한 질문과 유사하지만 목표는 반대입니다. 하이퍼 텍스트를 위해 여기에 연결하십시오.

+0

여전히 데이터베이스에 nil이 배치되지 않습니까? –

+0

저스틴이 맞습니다.이 경우 scrub_params는 "주소"키가 있는지 확인하고 주소 맵 (address : : city 포함)을 확인하지 않습니다. – kayne

+0

나는 ' nil's는 기본적으로 Ecto에 의해 데이터베이스에 저장되지 않지만 빈 문자열은 저장됩니다. – mudasobwa