小编Hai*_*ito的帖子

从内部杀死GenServer

考虑这样简单的GenServer模块:

defmodule Crap do
  use GenServer

  ... #All the needed crap

  def handle_info(:kill_me_pls, state) do
    GenServer.stop(self)
    {:noreply, state}
  end

  def terminate(_, state) do
    IO.inspect "Look! I'm dead."
  end

end
Run Code Online (Sandbox Code Playgroud)

并考虑将这些表达式放入repl中:

{:ok, pid} = Crap.start_link

send_message_to_that_pid
Run Code Online (Sandbox Code Playgroud)

这是我的conceirns开始的地方,因为Process.alive? pid返回true,但是进程没有响应而且terminate没有被调用,尽管如果我GenServer.stop(pid)在'clean'进程中调用repl(没有收到kill消息)就可以正常杀死它.如果停止调用收到的进程:kill_me_pls消息挂起了repl.

elixir

4
推荐指数
1
解决办法
1602
查看次数

将数据注入Phoenix的Action params

我正在尝试编写一些插件以减少项目中不需要的代码量,我很乐意将一些会话数据放入控制器操作的_params中.但我不知道该怎么做.我遇到了functon assign/3但据我所知它分配了要在模板中使用的数据.

def logged(conn, _opts) do
    case get_session(conn, :login) do
      nil -> conn
        |> Phoenix.Controller.put_flash(:error, "Musisz by? zalogowany")
        |> Phoenix.Controller.redirect( to: "/")
        |> Plug.Conn.halt
      login -> #here
    end
  end
Run Code Online (Sandbox Code Playgroud)

我希望能够做到:

def someaction(conn, %{"login" => login}) do
  #do something with login
end
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework

3
推荐指数
1
解决办法
2744
查看次数

在__using__宏中添加默认的handle_info

我试图围绕ExIrc做一个小包装,但我遇到了一些问题.__using__宏将ast附加到模块的开头,我想在默认情况下将函数定义附加到它的最后handle_info.我可以在使用该包装器的每个模块中手动完成它,但我更确定在某些时候我会忘记它.

我当前的包装器实现:

defmodule Cgas.IrcServer do
  defmacro __using__(opts) do
    quote do
      use GenServer
      alias ExIrc.Client
      require Logger
      defmodule State do
        defstruct host: "irc.chat.twitch.tv",
          port: 6667,
          pass: unquote(Keyword.get(opts, :password, "password")),
          nick: unquote(Keyword.get(opts, :nick, "uname")),
          client: nil,
          handlers: [],
          channel: "#cohhcarnage"
      end
      def start_link(client, state \\ %State{}) do
        GenServer.start_link(__MODULE__, [%{state | client: client}])
      end
      def init([state]) do
        ExIrc.Client.add_handler state.client, self
        ExIrc.Client.connect! state.client, state.host, state.port
        {:ok, state}
      end
      def handle_info({:connected, server, port}, state) do
        Logger.debug(state.nick <> " " …
Run Code Online (Sandbox Code Playgroud)

macros metaprogramming elixir

3
推荐指数
1
解决办法
132
查看次数

Phoenix Ecto Postgres表没有创建

Sup,首先,我想让你知道我对Phoenix Framework和Elixir很新鲜.我正在通过教程工作,但我遇到了奇怪的问题.我配置了连接,一切正常.但是迁移文件似乎没有被执行.我写了以下文件:

defmodule Hangman.Repo.Migrations.CreateWords do
  use Ecto.Migration

  def change do
    create table(:words) do
      add :content, :string

      timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这只是一个包含一个字段的简单表.但是Table没有在数据库中创建,但Ecto认为一切正常:

18:22:28.669 [info]  Already up
Run Code Online (Sandbox Code Playgroud)

postgresql elixir phoenix-framework

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

运行dev容器exec bash没有响应

我有以下Dockerfile:

FROM elixir:1.4.5
COPY . /
RUN mix compile
CMD echo "Application started" &&  elixir --name $MY_POD_NAMESPACE@$MY_POD_IP --no-halt --cookie $ERLANG_COOKIE -S mix run
Run Code Online (Sandbox Code Playgroud)

它启动并运行良好,但是当我尝试其中任何一个attatchexec XXX bash根本没有响应时.

elixir docker

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