标签: phoenix-framework

在Ecto中插入关联的模型

我正在尝试插入发票结构及其关联的发票项目.我可以插入发票数据,并调用匿名函数来验证,转换和插入每个项目.由于insert/2不会产生返回,如果一个项目未通过验证或插入,如何在仍然能够回滚整个事务的同时获取项目的invoice_id?

我把代码放在我自己的回购中,这里是:

def insertassoc(params) do
 Repo.transaction(fn ->    
  i = Invoice.changeset(params["data"], :create)
    if i.valid? do
      Repo.insert(i)
    else
      Repo.rollback(i.errors)
    end

  insert_include = fn k ->
    c = InvoiceItem.changeset(k, :create)
    if c.valid? do
      Repo.insert(c)
    else
      Repo.rollback(c.errors)
    end
  end

  for include <- params["includes"] do
    insert_include.(Map.merge(include, %{"invoice_id" => ????}))
  end

 end)
end
Run Code Online (Sandbox Code Playgroud)

以下是我在控制器中使用它的方法:

def create(conn, params) do
 case InvoiceRepo.insertassoc(params) do
  {:ok, x} ->
    json conn, Map.merge(params, %{"message" => "OK"})
  {:error, x} ->
    json conn |> put_status(400), Map.merge(params, %{"message" 
    => "Error"})
 end
end
Run Code Online (Sandbox Code Playgroud)

有没有很多最新的例子与Ecto,所以抱歉,如果这些是noob问题;-).有人有想法吗?我尝试将发票插入放在私有函数中,并使用case块来确定主事务是否应回滚,但我无法弄清楚如何从中获取发票ID.

elixir ecto phoenix-framework

17
推荐指数
2
解决办法
8397
查看次数

如何在eex中检查变量是否存在?

我正在研究一个模型的crud部分,我已经添加了图像支持.理想情况下,如果您正在编辑模型,我想显示图像,我会这样做.

<%= Logo.url({@company.logo, @company}, :thumb) %>
Run Code Online (Sandbox Code Playgroud)

问题是公司变量仅在编辑操作中可用,因为新操作上还有公司,所以我需要检查@company是否已设置.

<%= unless @company do %>
  <%= Logo.url({@company.logo, @company}, :thumb) %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

问题是,这会产生以下错误.

"分配@company在eex模板中不可用.可用分配:[:action,:changeset]"

我尝试使用is_nil,但同样的错误.

elixir phoenix-framework

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

在没有模型或变更集的情况下使用form_for

我正在尝试创建一个只有一个文本字段和一个隐藏字段的表单,我将在将数据传递给HTTP API时使用,因此我没有与之关联的模型,并且通过扩展,没有变更.

是否可以这样做并使用form_for或只是编写HTML来创建表单的答案?

elixir phoenix-framework

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

有没有办法在凤凰城定义自定义路线?

假设我想创建一个resources向它添加几个自定义动作,rails中的模拟是:

resources :tasks do
  member do
    get :implement
  end
end
Run Code Online (Sandbox Code Playgroud)

这不仅会给我带来7条标准路线,还会带来1条新路线:

GET /tasks/:id/implement
Run Code Online (Sandbox Code Playgroud)

我怎么能在凤凰城做到这一点?

elixir phoenix-framework

17
推荐指数
3
解决办法
4743
查看次数

在Elixir/Phoenix中呈现"OK"的最简约方法是什么?

在Rails中,您可以直接渲染文本,例如 render :text => 'OK'

Elixir/Phoenix中是否有快捷方式直接渲染文本,而无需定义模板或布局?

我找到的最短路是:

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

    def index(conn, _params) do
      # the file ok.html.eex contains just the string OK
      render conn, "ok.html", layout: false
    end
  end
Run Code Online (Sandbox Code Playgroud)

是否有更短的方式来呈现"OK",而无需提供模板文件"ok.html"?

phoenix-framework

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

如何处理Phoenix中的模式多态?

在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)

elixir polymorphic-associations ecto phoenix-framework

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

form_for在类中传递作为选项

我正试图给我的表格上课.通过文档查看,似乎没有办法做到这一点,并且你只能传递像这样的名字之类的东西

form_for @changeset, @action, [name: :search], fn f -> %>

有没有办法在类中传递作为一个选项,所以我的表单html元素可以有一个类?也许是这样的?

form_for @changeset, @action, [class: 'form-horizontal'], fn f ->

我正在挖掘凤凰源代码,但似乎无法找到任何东西.

elixir phoenix-framework

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

undefined函数:MyApp.Addict.Controller.init/1

我在凤凰城使用addict:1.0.3,我已经按照README指南在我的应用程序中使用登录.当我打电话登录时,我收到以下错误:

[error] #PID<0.2576.0> running MyApp.Endpoint terminated
Server: localhost:4000 (http)
Request: POST /login
** (exit) an exception was raised:
** (UndefinedFunctionError) undefined function: MyApp.Addict.Controller.init/1 (module MyApp.Addict.Controller is not available)
MyApp.Addict.Controller.init(:login)
(my_app) web/router.ex:1: anonymous fn/1 in MyApp.Router.match/4
(my_app) lib/phoenix/router.ex:255: MyApp.Router.dispatch/2
(my_app) web/router.ex:1: MyApp.Router.do_call/2
(my_app) lib/my_app/endpoint.ex:1: MyApp.Endpoint.phoenix_pipeline/1
(my_app) lib/plug/debugger.ex:90: MyApp.Endpoint."call (overridable 3)"/2
(my_app) lib/phoenix/endpoint/render_errors.ex:34: MyApp.Endpoint.call/2
(plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
(cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4
Run Code Online (Sandbox Code Playgroud)

authentication elixir phoenix-framework

16
推荐指数
2
解决办法
4708
查看次数

如何打印conn内容?

我尝试了以下内容

def index(conn, _params) do
    Logger.debug conn
     ......
Run Code Online (Sandbox Code Playgroud)

但我明白了

protocol String.Chars not implemented for %Plug.Conn
Run Code Online (Sandbox Code Playgroud)

我甚至尝试过Apex,但那也没有用.

elixir phoenix-framework

16
推荐指数
3
解决办法
4269
查看次数

Ecto中的数据类型 - "类型字符变化的值太长(255)"

ERROR 22001(string_data_right_truncation):类型字符变化的值太长(255)

我理解(并假设)字符串将限制为一定数量的字符; 但是,我不确定哪种类型最适合这种情况.

我应该使用什么类型的凤凰框架博客的"内容"部分?

数据将是文本段落,不能限制大小.

提前致谢.

elixir ecto phoenix-framework

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