Url接受字符串而不是带空格的Id

时间:2016-03-25 14:10:47

标签: elixir phoenix-framework

过去有人问过这个问题,我甚至回答过right here。 但是升级到1.1.2后,这种方法不再有效。正如名称中的任何白色空间,例如" Super Cleaner"现在被表示为" Super + Cleaner"这是传递给查询的值,因此没有收到命中。这样做的正确方法是什么?我认为它与Phoenix.Param有关,因为Valim在另一篇文章中回答了?问题归结为它被视为整数而不是字符串,我不知道为什么。

它是怎样的:http://localhost:4000/weapons/Super+Cleaner

应该如何:http://localhost:4000/weapons/Super%20Cleaner

编辑:已更新以包含我的代码

HTML

yxxu,01,,,,,,,,,,  
yxxu,,,03,,05,06,07,08,09,10,11,  

路由器

<a class="secondary button" href="<%= weapon_path(@conn, :html_weapon_info, weapon.name) %>">Weapon Details</a>

控制器

get "/weapons/:weapon_name", WeaponController, :html_weapon_info

我的问题是,weapon_name的值为&#34; Super + Cleaner&#34;现在,使查询返回没有结果。

1 个答案:

答案 0 :(得分:1)

对此的一般解决方案是你和José对你所关联问题的答案的结合。这是一个快速回顾:

1。为您的模型实施# web/router.ex resources "/weapons", WeaponController, param: "name" 协议

这告诉Phoenix在为您的模型呈现网址时要在URL中添加哪个属性。

# web/controllers/weapon_controller.ex

weapon = Repo.get_by!(Weapon, name: name)

2。调整路由器中的参数名称

这一步是可选的,但是如果参数包含名称而不是id,那么在我看来应该以这种方式调用它。

application/x-www-form-urlencoded

3。调整控制器以通过新参数

获取记录

由于我们不再在URL中传递ID,我们需要调整控制器中的查询以进行show / edit / update / delete操作以按名称而不是ID获取武器:

%20

最后,带空格的东西似乎是一个完全不同的问题。加编码空格来自wrap_content编码。但是,这种类型的编码仅在查询组件中有效,但不作为URL本身的一部分。你绝对应该将空格编码为fill_parent,这意味着你可能在凤凰城发现了一个错误!