这是前端中发送请求的代码-注意参数的顺序:
params = {ticket_guid: "XXX-XXX", user_name: "David", quantity: 2}
$.get('/init_stripe_transaction', params, function(data) {
这是浏览器上开发控制台中的“错误请求”数据,显示了参数的顺序:
http://localhost:4000/init_stripe_transaction?ticket_guid=XXX-XXX&user_name=David&quantity=2
这是终端(服务器端)的错误响应,即phoenix elixir def日志。注意-由于某些原因,现在如何更改参数的顺序:
[info] GET /init_stripe_transaction
[debug] Processing with DiceWeb.TransactionController.create_stripe_session/2
Parameters: %{"quantity" => "2", "ticket_guid" => "XXX-XXX", "user_name" => "David"}
Pipelines: [:browser]
[info] Sent 400 in 357ms
[debug] ** (Phoenix.ActionClauseError) no function clause matching in DiceWeb.TransactionController.create_stripe_session/2
这是我在控制器中进行模式匹配的方式:
def create_stripe_session(
conn,
%{ticket_guid: ticket_guid, user_name: user_name, quantity: quantity}
) do ...
[特供]:我对灵丹妙药/图案匹配非常陌生。因此,确定的堆栈溢出比在phoenix repo上创建问题更好。以这种方式进行图案匹配可以吗?
啊哇-显然还在用Ruby进行思考。
:
!= =>
,当使用地图像这样进行模式匹配时。简单地用粗箭头替换符号样式就解决了我的问题。不管参数在什么顺序上,都更有意义。 1)就像在红宝石中一样,地图:
%{a: 1, b: 2}
是地图的简写:
%{:a => 1, :b => 2}
在iex中:
iex(1)> %{a: 1, b: 2} == %{:a => 1, :b => 2}
true
2]在Elixir中,原子不会被垃圾回收,因此对atom table的大小有硬限制,这是存储原子的位置。 Phoenix可以防止您发送带有1亿个名称/值对的请求,如果将其作为原子/值对移交给您的应用,则会淹没原子表。而是,控制器中的操作会接收带有字符串/值对的映射,然后可以进行模式匹配以挑选出您感兴趣的字符串/值对。其余的字符串/值对将被垃圾回收。按照约定,然后将您模式匹配的键/值对转换为供内部使用的原子/值对,例如:
def world(conn, %{"name" => name}) do
render(conn, "world.html", name: name)
end
3)字符串不等同于原子:
iex(1)> "a" == :a
false
因此,如果某个函数的参数变量指定了一个具有原子作为键的映射,则该函数将不会与键为字符串的映射进行模式匹配:
defmodule My do
def go(%{:a => x}) do
IO.puts x
end
end
My.go(%{"a" => 10})
在命令行:
~/elixir_programs$ elixir a.exs
** (FunctionClauseError) no function clause matching in My.go/1
The following arguments were given to My.go/1:
# 1
%{"a" => 10}
a.exs:2: My.go/1
(elixir) lib/code.ex:767: Code.require_file/2
4)最终,您将遇到类似这样的内容:
def go(%User{}) do
...
end
[%User{}
匹配任何用户结构。