I'm using Programming Phoenix, adding a New User function to my app:
I get the following error:
deps/ecto/lib/ecto/repo/queryable.ex:188: value `"new"` in `where` cannot be cast to type :id in query:
from u in Microflow.User,
where: u.id == ^"new"
Error when casting value to `Microflow.User.id`
The code block up to deps/ecto/lib/ecto/repo/queryable.ex:188 is here:
defp query_for_get(_repo, queryable, id) do
query = Queryable.to_query(queryable)
model = assert_model!(query)
primary_key = primary_key_field!(model)
Ecto.Query.from(x in query, where: field(x, ^primary_key) == ^id)
Line 188:
Ecto.Query.from(x in query, where: field(x, ^primary_key) == ^id)
User Controller Update Here:
def create(conn, %{"user" => user_params}) do
changeset = User.changeset(%User{}, user_params)
case Repo.insert(changeset) do
{:ok, user} ->
conn
|> put_flash(:info, "#{user.name} created!")
|> redirect(to: user_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
EEX example here:
<h1>New User</h1>
<%= form_for @changeset, user_path(@conn, :create), fn f -> %>
<div class="form-group">
<%= text_input f, :name, placeholder: "Name", class: "form-control" %>
</div>
<%= form_for @changeset, user_path(@conn, :create), fn f -> %>
<div class="form-group">
<%= text_input f, :name, placeholder: "Name", class: "form-control" %>
</div>
<div class="form-group">
<%= text_input f, :username, placeholder: "Username", class: "form-control" %>
</div>
<div class="form-group">
<%= password_input f, :password, placeholder: "Password", class: "form-control" %>
</div>
<%= submit "Create User", class: "btn btn-primary" %>
<% end %>
Any ideas what I can do? Thanks if you can help.
Related discussion here:
Fixed by deleting this line:
get "/users/:id", Microflow.UserController, :show
and adding this:
resources "/users", Microflow.UserController
I don't know why a small change would raise an error like that, but I have rechecked it 5 times. I have seen many routing errors, but none that raised such an obscure error message.