【问题标题】:Create a query string for a URL in Phoenix在 Phoenix 中为 URL 创建查询字符串
【发布时间】:2017-05-08 12:47:56
【问题描述】:

在我的 Phoenix 应用程序中,我想将查询字符串添加到 URL:

some_cool_path(@conn, :index, "view-mode": "table")

我预计它会生成一个类似/some_cool?view-mode=table 的 URL,但它却抛出了一个异常:

protocol Phoenix.Param not implemented for ["view-mode": "table"]

我该如何解决这个问题?

【问题讨论】:

  • 你能把你定义这条路由的路由器代码贴出来吗?
  • @Dogbert,只是一条普通路线get "some_cooll", Controller1, :action1
  • 如果您的控制器和操作名称正确,则您的代码是正确的。该错误消息表明该路由实际上在 URL 中有一个强制参数。 post_path(MyApp.Endpoint, :index, "view-mode": "table") #=> "/posts?view-mode=table"。您能否将生成some_cool_path 助手的确切行粘贴到路由器中?
  • @Dogbert,没问题,我已经修好了。
  • 你确定吗?如果您手动编码查询并像下面的答案一样传递,您可能会得到/some_cool/view-mode=table,即不是查询字符串。

标签: elixir phoenix-framework


【解决方案1】:

要从关键字列表构建查询字符串,您可以使用URI.encode_query/1

iex(1)> URI.encode_query("view-mode": "table")
"view-mode=table"

但这似乎不是这里的问题。如果你的路由有一些必需的参数,你需要在传递查询关键字列表之前指定所有参数。

例如:

  • 如果您的路线类似于/users,那么您上面的代码就可以工作。
  • 但如果它有一个像/users/:id 这样的必需参数,您首先需要在为查询字符串指定关键字列表之前传递必需的参数。所以为此,你应该这样称呼:

    users_path(@conn, :show, @user.username, "view-mode": "table")
    

【讨论】:

  • 谢谢。还有一个问题:假设我有一个带有“#”的 url --> example.com/something#as_tableexample.com/something#as_chart。我将如何在动作的控制器中进行模式匹配或解构?意思是,它想获取#之后的值
  • 它被称为 Anchor 或 Fragment,它在服务器端不可用,仅在客户端可用。 See this answer.
猜你喜欢
  • 2015-04-19
  • 1970-01-01
  • 2020-12-22
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多