从 Elixir 的视图中调用渲染部分

nto*_*ier 0 rendering elixir phoenix-framework

我正在和 Phoenix 一起学习 Elixir,但陷入了一个相当愚蠢的境地。我想通过以下方式从索引模板内部调用部分的渲染:

#index.html.slim

- for element_here  <- array_here do
  = render MyApp.SharedView, "_game.html.slim", element: element_here
Run Code Online (Sandbox Code Playgroud)

为此,我创建了一个名为 shared_view.ex 的视图,如下所示:

defmodule MyApp.SharedView do
  use MyApp.Web, :view
  def render("game", _assigns), do: "/shared/_game.html.slim"
end
Run Code Online (Sandbox Code Playgroud)

我预计它会经历循环渲染共享/_game.html.slim,我将其复制到此处:

.col-md-4.portfolio-item
  a href="#"
    img.img-responsive alt="" src="http://placehold.it/700x400" /
  h3
    a href="#"  Project Name
  p Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.
Run Code Online (Sandbox Code Playgroud)

但没有任何内容被渲染。我也没有收到错误。它只是渲染之前和之后的内容。

我不确定我在这里缺少什么。没有路线或控制器操作连接到“_game”部分,因为我认为它没有必要(我习惯了 Rails,它在那里以这种方式工作)。

nto*_*ier 5

结果发现是拼写问题。有两个问题:

  1. 正如 @radubogdan 所解释的,Slim 扩展不应是明确的。
  2. 正如@Dogbert 所说,应该使用= for而不是添加循环- for

最后看起来像这样:

索引.html.slim

= for element_here  <- array_here do
  = render MyApp.SharedView, "_game.html", element: element_here
Run Code Online (Sandbox Code Playgroud)

共享视图.ex

defmodule MyApp.SharedView do
  use MyApp.Web, :view
  def render("game", _assigns), do: "/shared/_game.html.slim"
end
Run Code Online (Sandbox Code Playgroud)

_game.html.slim

.col-md-4.portfolio-item
  a href="#"
    img.img-responsive alt="" src="http://placehold.it/700x400" /
  h3
    a href="#"  Project Name
   p Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae.
Run Code Online (Sandbox Code Playgroud)