Elixir / Phoenix restringen parámetros como parámetros fuertes de Rails

Estoy haciendo una aplicación API solo de Phoenix. Vengo de un fondo de Ruby on Rails, así que tengan paciencia conmigo.

Digamos que tengo un modelo de usuario conemail, password, password_hashyrole campos.

Necesito restringir elrole ypassword_hash campos de entrada del usuario, o la lista blancaemail ypassword campos. En este momento, cualquiera podría publicar este registro como administrador:

{
    "user": {
        "email": "[email protected]",
        "password": "testpw",
        "password_hash": "shouldn't allow user input",
        "role": "admin"
    }
}

Esto normalmente se logra en Rails utilizando parámetros sólidos, que eliminarán los campos que no se especifican explícitamente.

¿Cómo restrinjo / incluyo los parámetros de la lista blanca con Phoenix usando las mejores prácticas?

Este es mi método de creación en mi user_controller:

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

Y aquí está mi esquema y conjuntos de cambios en el modelo, user.ex. estoy siguiendoen este tutorial, dice "canalizamos el nuevo conjunto de cambios a través del original"

  schema "users" do
    field :email, :string
    field :password, :string, virtual: true
    field :password_hash, :string
    field :role, :string

    timestamps()
  end

  def changeset(model, params \\ :empty) do
    model
    |> cast(params, ~w(email), [])
    |> downcase_email()
    |> unique_constraint(:email)
    |> validate_format(:email, ~r/@/)
  end

  def registration_changeset(model, params) do
    model
    |> changeset(params)
    |> cast(params, ~w(password), [])
    |> validate_length(:password, min: 6)
    |> put_password_hash()
  end

Fénixscrub_params está cerca, pero no suena como lo que necesito.

Creo que puedo lograr esto mediante la coincidencia de patrones, pero no estoy seguro de cómo.

Respuestas a la pregunta(2)

Su respuesta a la pregunta