HAML Rails 嵌套部分不工作

HAML Rails nested partials not working

我有多个视图,每个视图都包含在一堆 div 中:

.row
  .col-sm-8.col-sm-offset-2
    .panel.panel-default
      .panel-heading
        / Page heading goes here (eg. @form_heading)
      .panel-body
        = render 'form'

这用于跨多个模型的 shownewedit,并按预期显示。 index 有不同的布局。因此,我不能只将这些 div 添加到 application.html.haml

在每个 shownewedit 视图中都有它似乎不是很干,但是,当我将它放在部分视图中时,我会出错。

如果我使用:

# shared/_display_panel.html.haml
.row
  .col-sm-8.col-sm-offset-2
    .panel.panel-default
      .panel-heading
      / Page heading goes here (eg. @form_heading)
      .panel-body

# _form.html.haml
= simple_form_for @job do |f|
  = f.error_notification
  = render 'shared/error_messages', object: f.object
  .form-inputs
    = f.input :title
    = f.input :summary
    = f.input :body
  .form-actions
    = f.button :submit, 'Save Job', class: 'btn-success'

作为我的偏音,然后尝试:

# new.html.haml
= render 'shared/display_panel'
= render 'form'

正如预期的那样,我得到 form 呈现 outside/under display_panel div。

如果我尝试:

# new.html.haml
= render 'shared/display_panel'
  = render 'form'

Rails 抛出以下错误:

/home/(me)/Projects/(current-project)/app/views/(my-model)/new.html.haml:4: syntax error, unexpected keyword_ensure, expecting end-of-input ensure ^~~~~~
Extracted source (around line #4):
  2   = render 'form'

如果我将 .panel-body 移动到 _form 并尝试这两种方法,我会得到同样的错误。

我如何设置它以将部分与 HAML 一起使用并使其全部以预期的方式显示?

编辑:

理想情况下,我希望有一组 "style" 只为每个视图设置 div/class 结构的部分,无论它们的模型或控制器如何:

这类似于上面显示的 _display_panel.html.haml。 我还希望能够根据他们当前正在使用的模型在此之后呈现部分形式。我不想把所有的逻辑都放在部分中确定模型和方法。

不幸的是,您不能那样做,当您渲染 form 部分时,'shared/display_panel' 块已经关闭。尝试在 display_panel 内渲染部分表单。如果您不想在每个视图中显示它,您可以在视图中使用条件。

你可以这样做:

# shared/_display_panel.html.haml
.row
 .col-sm-8.col-sm-offset-2
  .panel.panel-default
   .panel-heading
    / Page heading goes here (eg. @form_heading)
   .panel-body
- if controller.controller_name == "your_controller_name" && controller.action_name == "new"
  = render 'form

不要忘记将添加的部分缩进到您希望嵌套的位置

使用 content_for 到 "assign" 将输出渲染到特定内容区域:

shared/_display_panel.html.haml

.row
  .col-sm-8.col-sm-offset-2
    .panel.panel-default
      .panel-heading
      / Page heading goes here (eg. @form_heading)
      .panel-body
        = content_for(:panel_body)

_form.html.haml

= simple_form_for @job do |f|
  = f.error_notification
  = render 'shared/error_messages', object: f.object
  .form-inputs
    = f.input :title
    = f.input :summary
    = f.input :body
  .form-actions
    = f.button :submit, 'Save Job', class: 'btn-success'

新.html.haml

- content_for :display_panel do
  = render 'form'

= render 'shared/display_panel'

即使您不知道 content_for,更简洁的解决方案是使用 "locals" 变量 "push" 部分名称进入您的视图:

shared/_display_panel.html.haml

.row
  .col-sm-8.col-sm-offset-2
    .panel.panel-default
      .panel-heading
      / Page heading goes here (eg. @form_heading)
      .panel-body
        = render partial_to_render

新.html.haml

= render 'shared/display_panel', partial_to_render: 'form'
# equivalent to
# render partial: 'shared/display_name', locals: { partial_to_render: 'form' }