many_to_many,checkboxes和cast_assoc

时间:2016-12-07 14:24:24

标签: phoenix-framework ecto

我很好奇获取表单结果的首选方法是什么,复选框表示many_to_many关系以将关系保存在变更集中?

这是一个例子: 架构:

  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
收到的快照:

%{email: "test@example.com", 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,这有助于解决问题,但我想知道是否有惯用的解决方案。

谢谢, 科里

1 个答案:

答案 0 :(得分:0)

错误:[roles:{“无效”,[type:{:array,:map}],例如:

列表包含许多项目,例如:

Server

与您在Template中的代码相同,然后更新或创建list_params,如:

$i

我认为“sub_schema”中的字段需要通过这样的传递:

<?php
  $i=1;
  while (your_condition) {
?>
    <input type='text' name='qqty[]' value='<?php echo $avail; ?>' id="avail<?= $i ?>" class='form-control1' readonly = 'readonly'>

    <select class="form-control1" name="qty[]" id="sType"  onChange="check('<?= $i ?>');">
            <option value="<?php echo $avail;?>"><?php echo $Uconv;?></option>
            <option value="<?php echo $qty;?>"><?php echo $uom;?></option>
    </select>

    //my javascript code
    <script>
    function check(i) {
       document.getElementById("avail"+i).value = document.getElementById("sType").value;
    }
    </script>
<?php
$i++;
} // end while
?>