【问题标题】:Change Url to accept a string instead id in phoenix framework (elixir)在 phoenix 框架 (elixir) 中更改 Url 以接受字符串而不是 id
【发布时间】:2016-04-06 20:28:49
【问题描述】:

我正在尝试在凤凰应用中实现永久链接。

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

我尝试在 permalinks implementation in rails 上关注 Ryan Bates 的一集 但无法在 phoenix 中找到模型的 to_param 函数。

请帮忙。

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

    除了 Wobbley 的响应之外,Phoenix 中的to_param 是通过协议实现的。例如,您可以通过以下方式更改产品 URL 的生成方式:

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

    Programming Phoenix 上还显示了一个更复杂的示例(免责声明:我是作者之一)。

    【讨论】:

    • 但是 phoenix(v1.2.rc) 生成的 restful 路由仍然使用 :id 作为默认参数名称,您需要使用显式设置参数。例如resources "/users", UserController, param: "name"
    • 另外,请查看文档:hexdocs.pm/phoenix/Phoenix.Param.html。该协议是可派生的,因此在 schema 调用之前在模型上添加 @derive {Phoenix.Param, key: :product_name} 就足以生成对 seo 友好的 url,而无需修改模板(仅在控制器中检索记录的方式)。
    • 如果有人想以某种方式修改结构键(例如,将product_name 小写),他们必须使用更长的defimpl 版本才能调用函数,对吗?
    【解决方案2】:

    不确定这是否是您要求的,但您可以这样做:

    浏览器堆栈中的router.ex

    get "/products/:product_name", ProductController, :get_product_by_name
    

    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
    

    如果您希望您的应用程序根据名称返回特定产品作为 html 页面,这应该是您所需要的,当然您需要在 templates/product 下有一个名称为“product_info.html.eex”的 html 页面

    【讨论】:

      猜你喜欢
      • 2016-07-13
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多