我想要做的是根据数据库中特定模型可用的slug动态路由顶级路径,例如GitHub如何为https://github.com/elixir-lang
和{{1}等用户/组织名称执行操作但是,我似乎无法在PhoenixFramework中了解它。
到目前为止,我在https://github.com/phoenixframework
中尝试的是:
routes.ex
但是当我尝试编译应用程序时,我最终得到以下错误:
Enum.each(MyApp.Repo.all(MyApp.User), fn section ->
get "/#{user.username}", UserController, :show, assigns: %{"username" => user.username}
end)
答案 0 :(得分:3)
Compilation error
是DSL,在编译期间解析,而不是在运行时解析。错误消息中的前两个单词是get /:user_slug, UserController, :show
。这意味着您无法在路线中使用数据库。
相反,尝试定义顶级路线,如下所示:
echo "deb http://repo.mysql.com/apt/ubuntu/ precise mysql-apt-config
deb http://repo.mysql.com/apt/ubuntu/ precise mysql-5.6" | sudo tee /etc/apt/sources.list.d/mysql.list
curl -s http://ronaldbradford.com/mysql/mysql.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install mysql-server-5.6
在您的控制器中,检查此用户是否存在于db中,如果没有,则返回404。
答案 1 :(得分:2)
我写了一篇关于如何做到这一点的博客文章:
http://www.adamcz.com/blog/pretty-urls-with-phoenix
如果你已经在数据库中有slug,你只需要在路由器文件中指定param:
resources "/users", UserController, only: [:index, ...], param: "slug"
然后在控制器中查找该参数:
def show(conn, %("slug" => slug}) do
user = Repo.get_by(User, slug: slug)