这个功能:
defp entries(query, page_number, page_size) do
offset = page_size * (page_number - 1)
query
|> limit([_], ^page_size) # error
|> offset([_], ^offset)
|> Repo.all
end
Run Code Online (Sandbox Code Playgroud)
给出了一个例外:
cannot use ^pg_size outside of match clauses
Run Code Online (Sandbox Code Playgroud)
为什么这样以及如何解决?
我正在尝试测试希望使用phoenix框架上传文件的控制器.我按照凤凰指南(http://www.phoenixframework.org/docs/file-uploads)上的指南进行操作,它在浏览器中工作,但我在编写测试时遇到了麻烦.这是我做的:
test "POST photo" do
{ :ok, raw_file } = File.read "1528_27.jpg"
conn() |> post("/api/v1/originals", %{ :image => raw_file })
# do some assertions
end
Run Code Online (Sandbox Code Playgroud)
问题是,在控制器中,我的文件永远不会以%Plug.Upload结构形式结束,而是以二进制形式结束.所以在测试时,我在控制器中的参数看起来像:
params: %{"image" => <<255, 216, 255, 225, 18, 180, 69, 120, 105, 102, 0, 0, 73, 73, 42, 0, 8, 0, 0, 0, 10, 0, 15, 1, 2, 0, 26, 0, 0, 0, 134, 0, 0, 0, 16, 1, 2, 0, 10, 0, ...>>},
Run Code Online (Sandbox Code Playgroud)
当我试图访问时,我的控制器会爆炸params["image"].path.这在从浏览器上传时起作用,因为那时,我在我的参数中有预期的上传结构:
params: %{
"image" …Run Code Online (Sandbox Code Playgroud) 在Phoenix Framework中,如何获取当前环境的名称?
我已经尝试过用env变量读取变量了System.get_env("MIX_ENV"),但是并不总是设置值.
如何在Elixir地图中添加(和删除)键值对?这不起作用:
map = %{a: 1, b: 2, c: 3}
map[:d] = 4
Run Code Online (Sandbox Code Playgroud) 使用IEx(Elixir的REPL),我希望能够保存我的命令历史记录.
例如:
我可以打开一个新的IEx会话并执行命令.执行命令后,我可以按向上箭头并预先填充我的最后一个命令.关闭IEx并重新打开后,我想访问我的最后一个命令.
有没有办法做到这一点?
让我们说我想模式匹配文本.具体来说,我想在第一个字母上模式匹配.
例如,如何创建一个匹配"约"和"模拟"但不匹配"beta"的模式?
我试过这个:
defmodule MatchStick do
def doMatch([head | tail]) when head == "a" do 1 end
def doMatch([head | tail]) do 0 end
end
res = MatchStick.doMatch("abcd");
Run Code Online (Sandbox Code Playgroud)
我也尝试过角色列表:
defmodule MatchStick do
def doMatch([head | tail]) when head == 'a' do 1 end
def doMatch([head | tail]) do 0 end
end
res = MatchStick.doMatch('abcd');
Run Code Online (Sandbox Code Playgroud)
都没有奏效.匹配文本的正确方法是什么?
Process.exit(self, :normal)做的工作,但它打印出来** (EXIT from #PID<0.49.0>) normal.有没有办法退出没有消息?
我正在编写一个模块来查询在线天气API.我决定将它作为一个受监督的应用程序来实现GenServer.
这是代码:
defmodule Weather do
use GenServer
def start_link() do
GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
end
def weather_in(city, country) do
GenServer.call(__MODULE__, {:weather_in, city, country_code})
end
def handle_call({:weather_in, city, country}) do
# response = call remote api
{:reply, response, nil}
end
end
Run Code Online (Sandbox Code Playgroud)
在我的测试中,我决定使用setup回调来启动服务器:
defmodule WeatherTest do
use ExUnit.Case
setup do
{:ok, genserver_pid} = Weather.start_link
{:ok, process: genserver_pid}
end
test "something" do
# assert something using Weather.weather_in
end
test "something else" do
# assert something else using Weather.weather_in
end …Run Code Online (Sandbox Code Playgroud) 在凤凰/ elixir项目中:什么是放置辅助函数的好地方.例如:我使用Timex来处理日期,但我必须对返回的结构进行一些转换,以便将它与我的数据库驱动程序一起使用(一个使用密钥:min,另一个:分钟等).我不想在每个模型中重复这段代码,而是编写一个简单的函数来完成它.什么是一个好地方放这个?只是在/ lib文件夹中的模块中?有没有关于如何组织这个的指导方针?
在我的Elixir/Phoenix应用程序中,当我跑步时
mix test
Run Code Online (Sandbox Code Playgroud)
我输出如下:
$ mix test
....
Finished in 0.09 seconds
4 tests, 0 failures
Run Code Online (Sandbox Code Playgroud)
每个测试成功的点数.
如何输出成功的测试名称?
在使用rspec的Rails中,我曾经在目录中使用.rspec文件执行此操作,该文件看起来像:
$ cat .rspec
--color
-fd
--tty
Run Code Online (Sandbox Code Playgroud)
Elixir中是否有相同的名称?