2016-12-07 2 views
0

changeset에 관계를 저장하기 위해 many_to_many 관계를 나타내는 체크 상자가있는 양식의 결과를 얻는 가장 좋은 방법은 무엇입니까? 스키마 :many_to_many, checkboxes and cast_assoc

schema "users" do 
    field :name, :string 
    field :email, :string 
    field :active, :boolean, default: true 
    has_many :products, TestExAdmin.Product 
    has_many :noids, TestExAdmin.Noid 
    many_to_many :roles, TestExAdmin.Role, join_through: TestExAdmin.UserRole 
    end 

체크 박스 :

<div class="form-group"> 
     <label class="col-sm-2 control-label" for="user_roles">Roles</label> 
     <div class="col-sm-10"> 
      <input name="user[roles][]" type="hidden" value=""> 
      <div class="checkbox"><label><input type="checkbox" name="user[roles][1]">role1</label></div> 
     </div> 
    </div> 

변경 집합 :

def changeset(model, params \\ %{}) do 
    model 
    |> cast(params, @required_fields, @optional_fields) 
    |> cast_assoc(:noids, required: false) 
    |> cast_assoc(:products, required: false) 
    |> cast_assoc(:roles, required: false) 
    end 

PARAMS 수신 :

%{email: "[email protected]", name: "Cory", 
    products: %{"1481120458618": %{_destroy: "0", price: "13.00", 
     title: "A product title"}}, roles: %{"1": "on"}} 
여기

은 일례이며

나는 현재 오류 :

errors: [roles: {"is invalid", [type: {:array, :map}] 

나는이 문제를 해결하지만, 관용적 솔루션이 있다면 제가 궁금 도움이 플러그인, https://github.com/adam12/phoenix_mtm을 발견했다.

감사합니다, 코리 오류로

+0

"현재 오류가 발생했습니다."어떤 오류가 발생 했습니까? – Dogbert

+0

감사합니다 @Dogbert 방금 추가 한 내용을 % {email : "[email protected]", 이름 : "Cory", 제품 : % { "1481122377646": % {_ destroy : "0", price : "# Ecto.Changeset , 제목 :"제품 제목 "}, 오류 : [], 데이터 : # TestExAdmin.Product <>, valid ?: true>]} errors : [roles : { "is invalid", [type : {: array, : map}]}], data : # TestExAdmin.User <> , 유효? : false> –

+0

elixir ecto google 그룹 요청 : https://groups.google.com/d/msg/elixir-ecto/s4heBr GN9J0/jwBFx3GBBAAJ –

답변

0

: [역할 : { "무효", [입력 : {: 배열 :지도}], 예를 들어 :

목록은 많은 항목을 가지고, 같은 : 템플릿에 코드

schema "lists" do 

    field :name, :string 

    field :length, :integer 

    has_many :items, AnotherAgent.Item, on_delete: :delete_all 

def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:name, :length]) 
    |> cast_assoc(:items, required: true) 
    |> validate_required([:name, :length]) 
end 

같은, 다음 업데이트 나처럼의 list_params를 만듭니다

%{"items" => %{"0" => %{"body" => "ten_list_item_0", "id" => "13"} }, "length" => "10", "name" => "ten"} 

"sub_schema"필드가 다음과 같이 전달되어야한다고 생각합니다.

%{"index_str" => %{"field_one" => "value1", "field_two" => "value2"}}