我甚至在Phoenix的最基本的会话操作上也遇到了麻烦。例如,如果我生成股票Phoenix(1.4)应用程序,而我所做的唯一更改就是page_controller.ex,其索引操作现在看起来像:
def index(conn, _params) do
put_session(conn, :franch, "foo")
text(conn, "session is: #{get_session(conn, :franch)}")
end
当我启动服务器并导航到该页面时,我看到:
session is:
是否需要执行一些其他配置才能将值存储在会话中? stock应用程序在浏览器管道中获取会话,因此我以为没有其他事情要做,但是也许我错了?
答案 0 :(得分:0)
由于Elixir是一种功能编程语言,因此变量是不可变的。这意味着除非重新分配变量,否则保证在方法调用之前和之后具有相同的值:
foo = "Hello"
AnyModule.anyMethod(foo)
foo # You are guaranteed that foo still points to the value "Hello"
获取变量foo引用除当前分配的值以外的某些值的唯一方法是重新分配它:
foo = "Hello"
foo = MyModule.addThere(foo)
foo # "Hello There"
因此,put_session(conn, key, value)
不能修改传入的参数conn
,而是返回一个新的Plug.Conn,它与旧的Plug.Conn基本上相同,只是具有新的键/值对。
要使文本正确显示,您需要将conn分配给方法的输出
conn = put_session(conn, key, value)