Change Url to accept a string instead id in phoeni

2020-02-10 21:29发布

I am trying to implement permalinks in phoenix app.

The goal is to change localhost:4000/products/1 to localhost:4000/products/productname

I tried following Ryan Bates episode on permalinks implementation in rails but wasn't able to find a to_param function for models in phoenix.

Please help.

2条回答
疯言疯语
2楼-- · 2020-02-10 21:44

In addition to Wobbley's response, to_param in Phoenix is implemented with protocols. For example, here is how you could change how the URLs for products are generated:

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

A more complex example is also shown on Programming Phoenix (disclaimer: I am one of the authors).

查看更多
混吃等死
3楼-- · 2020-02-10 22:02

Not sure if this is what you are asking for but here you go:

router.ex in the browser stack

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

That should be all you need if you want your application to return a specific product based on name as a html page, naturally you will need to have a html page with the name "product_info.html.eex" under templates/product

查看更多
登录 后发表回答