Elixir中的所有不可变数据结构都是持久的吗?如果不是,哪一个是哪个,哪个不是?另外,它们如何与Clojure中的持久数据结构进行比较?
当我阅读https://github.com/elixir-lang/ecto/issues/389及其相关问题时,Ecto似乎支持多态关联.
假设我需要在任务和事件模型上建立注释模型关联.如果我对Ecto与自定义源的关联是正确的,那么我们需要四个表和三个模型,
表
模型
任务和事件模型将具有与自定义源的has_many关联,如下所示.
defmodule ExampleApp.Task do
use ExampleApp.Web, :model
schema "tasks" do
field :title, :string
field :body, :string
has_many :comments, {"tasks_comments", Comment}
timestamps
end
end
defmodule ExampleApp.Event do
use ExampleApp.Web, :model
schema "events" do
field :title, :string
field :body, :string
has_many :comments, {"events_comments", Comment}
timestamps
end
end
Run Code Online (Sandbox Code Playgroud)
现在我不明白的是评论模型应该如何?
Comment模型如何处理两个表?以及它如何处理不同模型的belongs_to关联?
我正在部署我的第一个Phoenix应用程序,并且我在环境文件(dev.exs和prod.exs)中指定了变量的值.
现在我想弄清楚如何在我的控制器中访问它们.
# config/dev.exs
config :my_app, MyApp.Endpoint,
http: [port: 4000],
debug_errors: true,
cache_static_lookup: false,
my_var: "DEVELOPMENT VALUE"
# config/prod.exs
config :my_app, MyApp.Endpoint,
http: [port: {:system, "PORT"}],
url: [host: "example.com"],
my_var: "PRODUCTION VALUE"
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建指向我网站的Facebook页面标签.Facebook将HTTP POST请求发送到我网站的网址.这里的问题是服务器有一个内置的CSRF检查,它返回以下错误:
(Plug.CSRFProtection.InvalidCSRFTokenError) invalid CSRF (Cross Site Forgery Protection) token, make sure all requests include a '_csrf_token' param or an 'x-csrf-token' header`
Run Code Online (Sandbox Code Playgroud)
服务器需要Facebook不能拥有的CSRF令牌.所以,我想有选择地为路径www.mywebsite.com/facebook禁用CSRF.
我怎么能在Phoenix Framework中做到这一点?
()在IEx 1.2.4中键入时,光标将"跳转"到匹配的括号1s并向后移动.即使它不是真的跳跃但它有点令人讨厌.有没有办法在IEx中禁用此功能?
编辑:
虽然最初涉及IEx的问题,实际问题(正如@tkowal在下面的评论中所指出的)实际上是在IEx运行的Erlang Shell中.因此我在这个问题上添加了erlang-shell标签.
是否有更短的方式来写这个:
case testvalue do
200 ->
true
404 ->
true
_ ->
false
end
Run Code Online (Sandbox Code Playgroud)
对于200或404,它返回true,对于其他一切,它返回false.用OR条件写它会很好但这会导致错误:
case testvalue do
200 || 400 ->
true
_ ->
false
end
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用postgresql数据库设置我的elixir-phoenix应用程序以使用Docker运行.这就是我的Dockerfile的样子:
# ./Dockerfile
# Starting from the official Elixir 1.5.2 image:
# https://hub.docker.com/_/elixir/
FROM elixir:1.5.2
ENV DEBIAN_FRONTEND=noninteractive
# Install hex
RUN mix local.hex
# Install rebar
RUN mix local.rebar
# Install the Phoenix framework itself
RUN mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez
# Install NodeJS 6.x and the NPM
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
RUN apt-get install -y -q nodejs
# Set /lib as workdir
WORKDIR /lib
Run Code Online (Sandbox Code Playgroud)
这是我的docker-compose.yml文件:
web:
build: .
dockerfile: Dockerfile
env_file: .env
command: mix phx.server # Start the …Run Code Online (Sandbox Code Playgroud) 我很好奇我在定义函数时应该使用模式匹配vs guard子句.
例如,使用模式匹配:
defmodule Exponent do
def power(value, 0), do: 1
def power(value, n), do: value*power(value, n-1)
end
Run Code Online (Sandbox Code Playgroud)
vs护卫条款:
defmodule Exponent do
def power(value, n) when n==0, do: 1
def power(value, n), do: value*power(value, n-1)
end
Run Code Online (Sandbox Code Playgroud)
我的意思是两者产生相同的结果,但是一种优先于另一种的解决方案?如果是这样,为什么?
我是Elixir的新手,所以这个问题的答案对我来说还不是很明显.提前致谢.
我得到以下结构:
[nil,
%{attributes: %{updated_at: ~N[2017-09-21 08:34:11.899360]},
...]
Run Code Online (Sandbox Code Playgroud)
我想删除nils.我怎么做?尝试Enum.reduce/3但是没有用.
在Phoenix中处理多态关联的推荐方法似乎是添加一个包含对其他模式的引用的中间模式:
所以,如果我想用不同种类的动物创建模式,我会这样做:
defmodule Animal do
use Ecto.Model
schema "animals" do
belongs_to(:dog, Dog)
belongs_to(:cat, Cat)
belongs_to(:owner, PetOwner)
end
end
defmodule Dog do
use Ecto.Model
schema "dogs" do
end
end
defmodule Cat do
use Ecto.Model
schema "cats" do
end
end
defmodule PetOwner do
use Ecto.Model
schema "pet_owners" do
has_one(:pet, Animal)
end
end
Run Code Online (Sandbox Code Playgroud)
但我也可以使用PetOwner包含二进制字段和类型的模式:
defmodule Dog do
use Ecto.Model
schema "dogs" do
end
end
defmodule Cat do
use Ecto.Model
schema "cats" do
end
end
defmodule PetOwner do
use …Run Code Online (Sandbox Code Playgroud)