标签: phoenix-framework

Elixir Phoenix中的可选POST参数

我有一个凤凰路线,我想将一些表格数据发布到,但是表格中有大约4个字段是可选的(表格由最终用户构建,因此这些字段可能不存在于POST有效载荷中)

在路线的凤凰控制器中,您将如何处理?

例如:

我的表格有

Field1,
Field2
Field3 (optional)
Field4 (optional)
Field5 (optional)
Run Code Online (Sandbox Code Playgroud)

POST表单必须始终具有Field1,Field2但可以包含其他字段的任意组合.

所以到目前为止我的控制器代码是这样的:

def create(conn, %{"field1" => field1, "field2" => field2) do
end
Run Code Online (Sandbox Code Playgroud)

如何让其他3个可选?如果我将它们全部添加到那时它们将是必需的,我不希望为每个可能提交的表单创建一个函数,因为它似乎有点过分.

elixir phoenix-framework

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

凤凰服务器上的MIX_ENV = prod在PORT = 80时崩溃

我有一些问题,拌匀,MIX_ENV=prodmix phoenix.server,它失败的开始.在Linode的Ubuntu 14.04上运行所有最新的(Elixir 1.0.5,Phoenix 0.14.0),除了Erlang(17.x,17.3).

$ MIX_ENV=prod PORT=80 mix phoenix.server
{"Kernel pid terminated",application_controller,"{application_start_failure,elirc_site,{{shutdown,{failed_to_start_child,'Elixir.ElircSite.Endpoint',{shutdown,{failed_to_start_child,'Elixir.Phoenix.Endpoint.Server',{shutdown,{failed_to_start_child,{ranch_listener_sup,'Elixir.ElircSite.Endpoint.HTTP'},{shutdown,{failed_to_start_child,ranch_acceptors_sup,{{badmatch,{error,eacces}},[{ranch_acceptors_sup,init,1,[{file,\"src/ranch_acceptors_sup.erl\"},{line,30}]},{supervisor,init,1,[{file,\"supervisor.erl\"},{line,243}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,306}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,239}]}]}}}}}}}}},{'Elixir.ElircSite',start,[normal,[]]}}}"}
Run Code Online (Sandbox Code Playgroud)

具体来说,我认为这部分是追踪.

{{badmatch,{error,eacces}},[{ranch_acceptors_sup,init,1,[{file,\"src/ranch_acceptors_sup.erl\"},{line,30}]}
Run Code Online (Sandbox Code Playgroud)

elixir-mix elixir phoenix-framework

11
推荐指数
3
解决办法
2188
查看次数

在单个Phoenix模板中需要JavaScript模块

在单个Phoenix模板中需要定义的JavaScript模块的标准方法是什么?

我不希望模块需要在任何地方,但在这个模板中.

这是我正在使用的文件的片段.

网络/静态/ JS/trend_chart.js

let TrendChart = {
  //... some JS module code here
}
Run Code Online (Sandbox Code Playgroud)

网页/模板/布局/ app.html.eex

这有标准的app load/require.

...

<script src="<%= static_path(@conn, "/js/app.js") %>"></script>

<script>require("web/static/js/app")</script>

...
Run Code Online (Sandbox Code Playgroud)

网页/模板/页/ index.html.eex

<!-- what do i put in this template to require / load the TrendChart module code? -->
<!-- i don't want it required globally, so i don't want to put it in the app.html.eex file -->
Run Code Online (Sandbox Code Playgroud)

更新#1

我真的在寻找一种@inner在主布局中有两个块的方法.一个用于内容,另一个用于在内容之后加载其他JavaScript项目.

类似ASP.NET MVC中的部分.(我知道我知道!)

所以最终app.html.eex将会是这样的:

... …
Run Code Online (Sandbox Code Playgroud)

html javascript phoenix-framework

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

在已部署的服务器上记录到文件

我想在我部署的phoenix app上调试一个问题.有没有一种简单的方法来启用文件记录?

与rails创建uat.log和production.log的方式类似

elixir phoenix-framework

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

如何在函数保护条款中测试结构的值?

在这个小卫生功能的Phoenix/Elixir应用程序中,当用户没有输入电子邮件时,我会遇到问题.

我正在使用结构来处理数据.一个简单的卫生功能(现在)只是剥离空白并更新结构(地图).到目前为止,它的工作很好,但是当领域emailnil,我得到一个错误.

** (FunctionClauseError) no function clause matching in String.Unicode.strip/1
Run Code Online (Sandbox Code Playgroud)

所以我引入了一个guard子句来检查这种情况,然后只清理用户名.

defmodule MyApp.User do
  defstruct username: nil, email: nil, password: nil, hashed_password: nil

  # Sanitizing input without guard clause
  def sanitize_user(user)do
    %{user | username: String.strip(user.username), email: String.strip(user.email)}
  end


  # Sanitizing input with guard clause
  def sanitize_user(user) when is_nil(user.email) do
    %{user | username: String.strip(user.username)}
  end
  def sanitize_user(user) when is_binary(user.email) do
    %{user | username: String.strip(user.username), email: String.strip(user.email)}
  end
end
Run Code Online (Sandbox Code Playgroud)

现在我在编译时遇到错误:

** (CompileError) web/models/user.ex:54: cannot invoke remote function Access.get/2 …
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework

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

在Phoenix中创建和使用Elixir助手模块

我在我的虚拟博客凤凰应用程序中创建了一组验收测试.他们之间有一些重复的逻辑我想转移到帮手模块以保持干燥.

这是目录结构:

test/acceptance/post
??? create_test.exs
??? delete_test.exs
??? helpers.exs
??? index_test.exs
??? update_test.exs
Run Code Online (Sandbox Code Playgroud)

helpers.exs文件是我想坚持重复验收测试逻辑的地方.它看起来像:

defmodule Blog.Acceptance.Post.Helpers do
  def navigate_to_posts_index_page do
    # some code
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在我的一个测试文件中,比方说index_test.exs,我想导入帮助程序模块以使用它的方法:

defmodule Blog.Acceptance.Post.IndexTest do 
  import Blog.Acceptance.Post.Helpers
end
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

**(CompileError)test/acceptance/post/index_test.exs:7:模块Blog.Acceptance.Post.Helpers未加载且无法找到

如何在我的测试文件中访问或加载帮助程序模块?

elixir phoenix-framework

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

为什么Phoenix(ecto/Postgresx)无法在开发中连接

我正在开始我的Elixir/Phoenix之旅并且在我的postgres连接上遇到了一些麻烦.

当我启动我的服务器时,我得到:

 $ mix phoenix.server
 [error] Postgrex.Protocol (#PID<0.214.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
 [error] Postgrex.Protocol (#PID<0.217.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
 [error] Postgrex.Protocol (#PID<0.218.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
 [error] Postgrex.Protocol (#PID<0.211.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
 [error] Postgrex.Protocol (#PID<0.215.0>) failed to connect: ** (Postgrex.Error) tcp connect: connection refused - :econnrefused
 [error] Postgrex.Protocol (#PID<0.219.0>) failed to …
Run Code Online (Sandbox Code Playgroud)

elixir boxen ecto phoenix-framework

11
推荐指数
2
解决办法
1万
查看次数

如何从另一个Phoenix应用程序连接到远程/外部Phoenix应用程序频道?

我希望逐步将遗留API应用程序移植到Phoenix.理想情况下,我会将应用程序的子域划分为单独的Phoenix应用程序,并将它们托管在不同的服务器节点上.

我希望使用Phoenix频道来促进应用与应用之间的沟通.如何将一个Phoenix应用程序连接到另一个渠道和主题?例如,我想设置一个带有WebSockets的'jobs.foo.com'子域,如:

socket "/ws", Jobs do
   channel "jobs:work_orders", WorkOrdersChannel
end
Run Code Online (Sandbox Code Playgroud)

从另一个凤凰应用程序(例如:报告)我想发布/转到该职位频道主题.是否可以Phoenix.Endpoint在Reports中创建Jobs lib,并Jobs.Endpoint在config.exs中配置该url?我可以使用类似于Phoenix.PubSub.subscribe/4名为pubsub端点的东西吗?

我不确定我的想法是否合理.如果有更明智的方法,我愿意接受建议.

- 编辑 -

只是为了澄清我想要完成的事情......我想让一个Phoenix应用程序通过WebSocket客户端连接到另一个.这将允许我拥有具有不同域逻辑的应用程序,通过频道和共同感兴趣的主题进行通信.

elixir phoenix-framework

10
推荐指数
2
解决办法
4052
查看次数

Phoenix App中预编译的单页应用程序

我有一个预编译的ember.js应用程序(fronted-js-framework在这里不重要),它基本上由一个带有index.html文件的文件夹和一些js/css资产组成.

我把这个文件夹放在我的凤凰应用程序中的/ priv/static下,并试图让路由服务它...到目前为止没有成功.我在凤凰版0.17.1(与1.0 afaik相同).我按顺序尝试了以下步骤:

  • 在endpoint.ex中,我删除了only: ~w(...)过滤器.
  • 通过单个操作实现了一个最小的控制器来提供文件: def index(conn, _params) do redirect conn, to: "/my_app/index.html" end
  • 将控制器添加到我的routes.ex: get "/my_app", MyCustomController, :index

到目前为止,上述步骤均无效,我只得到错误no route found for GET /my_app/index.html.我怎么能解决这个问题?我只想将URL "/my_app"(或者,如果没有其他工作原理"/my_app/index.html")映射到priv/static/my_app/index.html我的凤凰应用程序中的路径.有任何想法吗?

编辑:

我尝试实现的基本工作流程如下:

我有不同的开发人员在其专用文件夹中构建一些ember.js SPA $phoenix_root/apps/.所以我有一个$phoenix_root/apps/my_app带有ember和ember-cli 的开发人员.这个开发人员ember server在开发他的应用程序时使用,并且mix phoenix.server在后台运行,因为phoenix应用程序本身将所需数据公开为RESTful API.

在每个实现的功能,前端开发人员类型之后ember build [...],此任务将整个ember.js前端应用程序编译到一个文件夹中,带有index.html文件和一些资源,并将此文件夹移动到$phoenix_root/web/static/assets/my_app.然后凤凰(或早午餐)触发,并复制这个东西原样$phoenix_root/priv/static/my_app,随时可以提供像任何其他资产.

关键是能够在单个代码库(凤凰应用程序)中构建一堆孤立的"前端"作为自包含的包,而凤凰应用程序本身还有其他(其他)要做的事情.

因为Frontend-Developers每次都自动生成SPA,所以我非常想避免修改新的index.html文件.在性能方面,将这些SPA作为静态文件提供服务是最好的 - 它们在用户浏览器内自行初始化.

我希望这可以为我这样做添加一些说明.

编辑2:

我现在有一个工作解决方案,请参阅我为演示目的创建的示例repo:https://github.com/Anonyfox/Phoenix-Example-Multiple-SPA-Frontends

凤凰应用程序的必要修改:

  • 修改endpoint.ex …

elixir single-page-application phoenix-framework

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

Elixir Phoenix全球变量插头

我试图基于其域获取网站的标识符,但在为其编写插件后,我遇到了一个问题,其中系统中的所有链接都返回根URL内容.

LIB/MyApp的/插头/ request_var.ex

defmodule Myapp.Plug.RequestVar do
  import Plug.Conn

  @doc false
  def init(default), do: default

  @doc false
  def call(conn, router) do
    host = conn.host
    if host == "ll.com" || host == "domain1.com" do
      slug = "domain1"
    else
      slug = "domain2"
    end

    conn |> put_private(:site_slug, slug)
  end
end
Run Code Online (Sandbox Code Playgroud)

在lib/myapp/endpoint.ex中

plug Myapp.Plug.RequestVar, Myapp.Router
plug Myapp.Router
Run Code Online (Sandbox Code Playgroud)

这个插头有什么问题吗?

编辑:根据响应修复"if"条件.

elixir phoenix-framework

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