标签: elixir

Elixir:修改模块属性的值

是否有可能实现以下行为,其中一个人试图改变模块属性的值来改变模块方法的行为?

defmodule Adder do
  @num_to_add 10
  def addTo(input), do: input + @num_to_add
end

IO.inspect Adder.addTo(5)  # Prints 15

Adder.num_to_add = 20

IO.inspect Adder.addTo(5)  # Expect it to print 25
Run Code Online (Sandbox Code Playgroud)

它抛出错误

** (CompileError) hello.exs:8: cannot invoke remote function Adder.num_to_add/0 inside match
    (elixir) src/elixir_clauses.erl:26: :elixir_clauses.match/3
Run Code Online (Sandbox Code Playgroud)

如果这是不可能的(因为Elixir中的所有内容都应该是不可变的),是否有任何Elixir方法可以实现类似的行为.

elixir

9
推荐指数
2
解决办法
3190
查看次数

如果引发编译时警告,是否有可能让编译器提前退出,使构建失败?

我发现编译时警告非常有用,但我偶尔可能会错过它们,特别是如果它是在一个测试在CI服务器上运行的pull请求中.

理想情况下,我会在项目组合文件中指定一些会使编译器更严格的内容.

我希望这对所有混合任务都有效,我不想将标志传递给命令,因为这很容易忘记.

例如,对于带有编译器警告的项目,此命令应该失败

mix clean && mix compile
Run Code Online (Sandbox Code Playgroud)

应该是这个

mix clean && mix test
Run Code Online (Sandbox Code Playgroud)

elixir-mix elixir

9
推荐指数
2
解决办法
1065
查看次数

字符串/二进制参数结束时的模式匹配

我目前正在Elixir写一个小试飞员.我想使用模式匹配来评估文件是否是规范格式(以"_spec.exs"结尾).有很多关于如何在字符串的开头进行模式匹配的教程,但是这不知道如何在字符串结尾处起作用:

defp filter_spec(file <> "_spec.exs") do
  run_spec(file)
end

defp run_spec(file) do
  ...
end
Run Code Online (Sandbox Code Playgroud)

这总是在编译错误中结束:

== Compilation error on file lib/monitor.ex ==
** (CompileError) lib/monitor.ex:13: a binary field without size is only allowed at the end of a binary pattern
    (stdlib) lists.erl:1337: :lists.foreach/2
    (stdlib) erl_eval.erl:669: :erl_eval.do_apply/6
Run Code Online (Sandbox Code Playgroud)

那有什么解决方案吗?

elixir

9
推荐指数
1
解决办法
2806
查看次数

如何使用HTTPoison在Elixir中执行DELETE?

我想使用HTTPoison Library在Elixir中执行以下命令.

$ curl -X DELETE -H "expired: 1442395800" -H "signature: ******************" -d '{"api_key":"***************","delete_path":"*******","expired":"****"}' https://cdn.idcfcloud.com/api/v0/caches
{"status":"success","messages":"We accept the cache deleted successfully."}
Run Code Online (Sandbox Code Playgroud)

当我检查的文件如何DELETEHTTPoison

def delete!(url, headers \\ [], options \\ []),   do: request!(:delete, url, "", headers, options)
Run Code Online (Sandbox Code Playgroud)

只有urlheader需要.那么我应该把请求体(json体)放在curl哪里?

在Elixir,我试过了

req_body = "{\"api_key\":\"#{api_key}\",\"delete_path\":\"#{delete_path}\",\"expired\":\"#{expired}\"}"

url = "https://cdn.idcfcloud.com/api/v0/caches"                                                                                           

response = HTTPoison.delete!(url, header, [req_body])
Run Code Online (Sandbox Code Playgroud)

但似乎行不通.有人能说出正确的方法吗?

curl elixir http-delete

9
推荐指数
1
解决办法
721
查看次数

在Phoenix框架中的插件内重定向

我正在尝试编写一个Plug会对用户进行身份验证(实际检查会话).我无法获得重定向路由.我认为这是因为路由生成在激活此插件后发生.

无论如何我得到这样的错误: undefined function TestApp.page_path/2

在常规背景下,page_path/2显然存在并且有效.

defmodule TestApp.Plugs.Authenticate do
  import Plug.Conn

  def init(default), do: default

  def call(conn, _)  do
    user = Plug.Conn.get_session(conn, :current_user)
    if not is_nil(user) do
      assign(conn, :user, user)
    else
      conn
      |> Phoenix.Controller.put_flash(:warning, "User is not authenticated.")
      |> Phoenix.Controller.redirect(to: TestApp.page_path(conn, :index))
      |> halt
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework

9
推荐指数
1
解决办法
4291
查看次数

模块插头的防护装置?

请原谅新手问题,但我发现了许多保护功能插头的例子:

plug :assign_welcome_message, "Hi!" when action in [:index, :show]
Run Code Online (Sandbox Code Playgroud)

但我没有找到如何使用模块插件执行此操作的示例:

plug Guardian.Plug.EnsurePermissions,
  handler: Mp.Api.AuthController,
  admin: [:dashboard] when action in [:protected_action]
Run Code Online (Sandbox Code Playgroud)

我似乎移动的when action in [:protected_action]任何地方或者给我一个语法错误或一个未定义的函数when/2.我知道我做的事情很愚蠢,但我看不清楚!

救命!


phoenix 1.1.4

elixir phoenix-framework

9
推荐指数
1
解决办法
991
查看次数

在Elixir中哪些情况需要投掷/捕获?

因此,在Elixir文档的这一中,我和一些朋友围绕着一段话进行了对话.

在Elixir中,可以抛出一个值,然后被捕获.throw和catch保留用于无法检索值的情况,除非使用throw和catch.

除非与未提供适当API的库接口,否则这些情况在实践中非常罕见.

哪些情况需要使用try/throw/catchvs. try/rescue?这是为了与一些现有的Erlang库连接吗?页面上的示例显示了Elixir代码,这是我觉得有点混乱.

什么是我应该寻找的"适当的API"?我的意思是这是一个协议吗?

elixir

9
推荐指数
1
解决办法
1483
查看次数

如何否定管道中的布尔值?

请考虑以下代码:

defmodule T do
  def does_not_contain?(s, t) do
    s |> not(String.contains?(t))
  end
end
Run Code Online (Sandbox Code Playgroud)

这会在编译时出现以下错误:

** (CompileError) iex:3: undefined function not/2
Run Code Online (Sandbox Code Playgroud)

我也试过这样的结构:

defmodule T do
  def does_not_contain?(s, t) do
    s |> String.contains?(t) |> not
  end
end
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误:

** (SyntaxError) iex:4: unexpected token: end
Run Code Online (Sandbox Code Playgroud)

我可以做这样的工作:

defmodule T do
  def does_not_contain?(s, t) do
    does_contain = s |> String.contains?(t)
    not(does_contain)
  end
end
Run Code Online (Sandbox Code Playgroud)

但尝试将整个事情保持在管道中是非常有吸引力的.有没有办法在管道中否定一个布尔值?

elixir

9
推荐指数
1
解决办法
1337
查看次数

使用插头在凤凰城进行特定操作

如何使用插头对凤凰的具体操作.想要使用插件进行某些操作的场景,或者相反,希望在某些操作中使用插件

elixir phoenix-framework

9
推荐指数
1
解决办法
3566
查看次数

如何在凤凰框架中获取当前的url

我想知道目前使用elixir/phoenix框架的网址,我怎么能得到这个?

编辑#1:

我的nginx配置文件:

server {
        client_max_body_size 100M;

        listen  80;

        server_name *.babysittingbordeaux.dev *.babysittingparis.dev

        access_log  /usr/local/var/log/nginx/baby-access.log;
        error_log   /usr/local/var/log/nginx/baby-error.log;


        location / {
            proxy_pass http://127.0.0.1:4000;
        }
}
Run Code Online (Sandbox Code Playgroud)

码:

Atom.to_string(conn.scheme) <> "://" <> (Enum.into(conn.req_headers, %{}) |> Map.get("host")) <> conn.request_path
Run Code Online (Sandbox Code Playgroud)

那个例子返回http://127.0.0.1:4000/,我想得到http://www.babysittingbordeaux.dev/

我正处于开发模式.

elixir phoenix-framework

9
推荐指数
3
解决办法
5844
查看次数

标签 统计

elixir ×10

phoenix-framework ×4

curl ×1

elixir-mix ×1

http-delete ×1