I need to be able to generate random url safe strings so I could use those in links (like in an activation link sent to a user's email), so how can I generate it? Is there a way to do that only with Elixir or I'd have to use some library?
What you can do instead is to generate a Base64-encoded string to be used as a confirmation token. This confirmation token will then be saved to your DB and passed as params to the activation link. Your activation url would look something like:
activation_url(MyApp.Endpoint, :confirm, confirm_id: confirm_id)
The above url helper assumes you have a MyApp.ActivationController
and a confirm/2
action in that controller. To generate the confirm_id
, you could do:
def random_string(length) do :crypto.strong_rand_bytes(length) |> Base.url_encode64 |> binary_part(0, length) end # random_string(64)
In your MyApp.ActivationController.confirm/2
, you could have code lik:
def confirm(conn, %{"confirm_id" => confirm_id}) do user = Repo.get_by(User, confirm_id: confirm_id) User.confirm(user) conn |> put_flash(:info, "Account confirmed!") |> redirect(to: "/") end
Hope that helps!
You can easily define a module to do this. In this example, @chars
determines what characters appear in your generated strings.
defmodule StringGenerator do @chars "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |> String.split("") def string_of_length(length) do Enum.reduce((1..length), [], fn (_i, acc) -> [Enum.random(@chars) | acc] end) |> Enum.join("") end end StringGenerator.string_of_length(3) # => "YCZ"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With