HAML Rails嵌套的部分不起作用

时间:2018-02-03 16:47:13

标签: ruby-on-rails haml

我有多个视图,每个视图都隐藏在一堆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 div之外/之下呈现display_panel

如果我尝试:

# 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结构的partials,无论其模型或控制器如何:

  • 一个用于neweditshow
  • 一个index

这就像上面显示的_display_panel.html.haml。 我还希望能够基于他们当前使用的模型在此之后呈现部分表单。我不想把所有逻辑确定为部分中的模型和方法。

2 个答案:

答案 0 :(得分:4)

使用content_for来"分配"将输出呈现到特定内容区域:

共享/ _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'

new.html.haml

- content_for :display_panel do
  = render 'form'

= render 'shared/display_panel'

即使您不了解content_for,更清洁的解决方案是"推送"使用" locals"进入视图的部分名称变量:

共享/ _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

new.html.haml

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

答案 1 :(得分:-1)

不幸的是,你不能这样做,'shared/display_panel'块在渲染form部分时已经关闭。尝试在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

不要忘记缩进将添加的部分渲染到您想要嵌套的位置