Skip to content

Instantly share code, notes, and snippets.

@hassox
Last active August 29, 2015 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hassox/6c25e445479a6974cb3a to your computer and use it in GitHub Desktop.
Save hassox/6c25e445479a6974cb3a to your computer and use it in GitHub Desktop.
struct(User, params) does not transfer values
09:52:35.045 request_id=oOTTwz6ywSK5RsianPnN [info] POST /users
RAW PARAMS
09:52:35.069 request_id=oOTTwz6ywSK5RsianPnN [debug] Processing by CloseBy.UserController.create
Accept: text/html
Parameters: %{"user" => %{"confirm_password" => "p", "email" => "foo@foobarbaz.com", "password" => "p"}}
%{"user" => %{"confirm_password" => "p", "email" => "foo@foobarbaz.com",
"password" => "p"}}
THE CREATE PARAMS params["user"]
%{"confirm_password" => "p", "email" => "foo@foobarbaz.com", "password" => "p"}
09:52:35.192 request_id=oOTTwz6ywSK5RsianPnN [info] Sent 422 in 147ms
%{"confirm_password" => "p", "email" => "lskjdflskdjf@owieurowieru.com",
"password" => "p"}
defmodule User do
use Ecto.Model
schema "users" do
field :email
field :encrypted_password
field :password, :virtual
field :confirm_password, :virtual
end
validate user,
email: present()
def set_password(user, password, password_confirmation) do
if (password == password_confirmation) do
%{user | encrypted_password: encrypt_password(password), password: nil}
else
user
end
end
defp encrypt_password(nil), do: nil
defp encrypt_password(password), do: :erlpass.hash(password, 10)
end
defmodule CloseBy.UserController do
use CloseBy.ApplicationController
plug :action
def create(conn, params) do
user_params = params["user"] || %{}
case User.Create.from_params(user_params) do
{ :ok, user } -> redirect conn, CloseBy.Router.Helpers.users_path(:show, user.id)
{ :error, results } -> conn |> put_status(422) |> render "new", results
end
end
end
defmodule User.Create do
def from_params(params) do
password = params["password"]
confirmation = params["confirm_password"]
if password != confirmation do
{ :error, [{:password_confirmation, ["Does not match"]}] }
end
user = struct(User, params)
IO.puts("USER")
IO.inspect(user)
user = user |> User.set_password(password, confirmation)
case User.validate(user) do
[] ->
user = CloseBy.Repo.insert(user)
{ :ok, user }
errors ->
{ :error, [{:user, user}, {:errors, errors}] }
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment