动态定义Phoenix routes.ex中的顶级路由

时间:2016-01-15 00:44:27

标签: elixir phoenix-framework

我想要做的是根据数据库中特定模型可用的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)

2 个答案:

答案 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)