更改URL以在phoenix框架(elixir)中接受字符串而不是id

Rob*_*nki 10 elixir ecto phoenix-framework

我试图在凤凰应用程序中实现永久链接.

目标是将localhost:4000/products/1更改为localhost:4000/products/productname

我尝试跟踪Ryan Bates的一集关于rails中的永久链接实现, 但是无法为凤凰城的模型找到一个to_param函数.

请帮忙.

Jos*_*lim 22

除了Wobbley的回应之外,to_paramPhoenix还通过协议实现.例如,以下是如何更改产品的URL生成方式:

defimpl Phoenix.Param, for: MyApp.Product do
  def to_param(%{name: name}) do
    "#{name}"
  end
end
Run Code Online (Sandbox Code Playgroud)

编程凤凰也显示了一个更复杂的例子(免责声明:我是其中一位作者).

  • 但是phoenix(v1.2.rc)生成的其余路由仍然使用:id作为默认参数名称,需要使用显式set param.例如`resources"/ users",UserController,param:"name"` (4认同)
  • 另外,请查看文档:https://hexdocs.pm/phoenix/Phoenix.Param.html.这个协议是可派生的,所以在`schema`调用之前在你的模型上添加`@derive {Phoenix.Param,key :: product_name}`应该足以生成seo友好的url而不修改你的模板(只有你如何检索记录)控制器). (3认同)

Wob*_*ley 8

不确定这是否是你要求的但是你去了:

router.ex在浏览器堆栈中

get "/products/:product_name", ProductController, :get_product_by_name
Run Code Online (Sandbox Code Playgroud)

product_controller.ex

def get_product_by_name(conn, %{"product_name" => product_name}) do
  product = Repo.get_by(Product, name: product_name)
  render(conn, "product_info.html", product)
end
Run Code Online (Sandbox Code Playgroud)

如果您希望应用程序根据名称将特定产品作为html页面返回,那么这应该就是您所需要的,当然您需要在模板/产品下有一个名为"product_info.html.eex"的html页面