Post 形态 belongs_to 联想灵药

Post a form with belongs_to association elixir

我需要创建一个包含许多 rolesUser,所以我按照以下步骤操作:

我创建了两个模型,模式是:

schema "roles" do
  field :name, :string
  belongs_to :user, Module.User

  timestamps()
end           

schema "users" do
  field :name, :string
  field :cnpj, :string
  has_many :roles, Module.Role

  timestamps()                                       
end

我正在尝试创建一个表单来创建具有任何角色的用户,但没有成功。

我的 create 控制器操作如下所示:

def create(conn, %{"user" => user_params}) do
  changeset = User.changeset(%User{},user_params)                            

  case Repo.insert(changeset) do
  ...

在创建用户的表单中,我向 multiple_select 角色添加了一个字段,但它生成了一个无效的变更集

<%= inputs_for f, :roles, fn i -> %>
  <div class="form-group">
    <%= label i, :name, gettext("Roles"), class: "control-label" %>
    <%= multiple_select(i, :name, ["Admin": "1", "User": "2", "Power": "3"]) %>
  </div>
<% end %>

生成的变更集有错误:

#Ecto.Changeset<action: :insert, changes: %{cnpj: "01578216908926", roles: [#Ecto.Changeset<action: :insert, changes: %{}, errors: [name: {"is invalid", [type: :string]}], data: #Module.Role<>, valid?: false>], name: "xxx"}, errors: [], data: #Module.User<>, valid?: false>

有什么方法可以创建吗,还是我走错路了?

您正在创建一个 Role 模型,其中 name 是一个 List,而不是几个 Role 模型,每个模型都有 String name。 这就是出现错误的原因(字段 name 的列表而不是字符串)。

也许您不需要为用户角色创建一个单独的模型,在用户模型中添加一个额外的字段(字符串列表)就可以了:

schema "users" do
  field :name, :string
  field :cnpj, :string
  field :roles, {:array, :string}

  timestamps()                     
end