【问题标题】:Random router in Phoenix frameworkPhoenix框架中的随机路由器
【发布时间】:2016-04-15 04:23:59
【问题描述】:

我想随机路由传入的请求。

到目前为止,我只想到了这个:

defmodule Test.PageController do
  use Test.Web, :controller

  plug :assign_random_number

  def index(%{assigns: %{random_number: random_number}} = conn, _params)
    when random_number > 0.1 do
    render conn, "index.html", fortune: "one"
  end
  def index(conn, _params) do
    render conn, "index.html", fortune: "two"
  end

  defp assign_random_number(conn, _params) do
    :random.seed(:erlang.now)
    assign(conn, :random_number, :random.uniform)
  end
end

router.ex 中是否可以有这种“随机化”逻辑?就像在 Sinatra 中一样

get "/", :random_number > 0.1 do
  "one"
end

get "/" do
  "two"
end

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    您不能(也不应该)在 Elixir 中的路由级别这样做。事实上,你甚至不能在 Sinatra 中做到这一点!您发布的代码是无效的 Ruby:

    get "/", :random_number > 0.1 do
      "one"
    end
    # => ArgumentError: comparison of Symbol with 0.1 failed
    

    以下是您在 Sinatra 中实际完成此操作的方法:

    get "/" do                        # <- Routing layer
      rand > 0.1 ? 'one' : 'two'      # <- Response/controller layer
    end
    

    请注意,我们依靠响应/控制器层来处理随机化。我们可以在 Elixir 中做类似的事情:

    defmodule Test.PageController do
      use Test.Web, :controller
    
      def index(conn, _params) do
        render conn, "index.html", fortune: make_fortune
      end
    
      defp make_fortune do
        if :random.uniform > 0.1, do: "one", else: "two"
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多