代码之家  ›  专栏  ›  技术社区  ›  Josh

HAML Rails嵌套分区不工作

  •  0
  • Josh  · 技术社区  · 7 年前

    我有多个视图,每个视图都包含在一组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'
    

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

    在每一个 显示 , 编辑 视图,但是,当我将其放在部分中时,会出现错误。

    如果我使用:

    # 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'
    

    作为我的partials,然后尝试:

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

    一、 如预期的那样,获取 form 在外部/下方渲染 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一起使用partials,并以预期的方式显示所有内容?

    编辑:

    理想情况下,我希望有一组“样式”分区,只为每个视图设置div/class结构,而不考虑其模型或控制器:

    • 一个用于 , 编辑 显示
    • 一个用于 指数

    那就像 _display_panel.html.haml 如上所示。 我还希望能够根据他们当前使用的模型,在此之后渲染部分表单。我不想把所有的逻辑都放在部分中,确定模型和方法。

    2 回复  |  直到 7 年前
        1
  •  4
  •   Josh    7 年前

    使用 content_for 要将渲染输出“指定”到特定内容区域,请执行以下操作:

    共享/\u display\u面板。html。哈默尔

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

    _表格。html。哈默尔

    = 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。哈默尔

    - content_for :display_panel do
      = render 'form'
    
    = render 'shared/display_panel'
    

    即使你不知道 content\u for ,更简洁的解决方案是使用“locals”变量将部分的名称“推”到视图中:

    共享/\u display\u面板。html。哈默尔

    .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。哈默尔

    = render 'shared/display_panel', partial_to_render: 'form'
    # equivalent to
    # render partial: 'shared/display_name', locals: { partial_to_render: 'form' }
    
        2
  •  -1
  •   dstrants    7 年前

    不幸的是,您不能这样做 '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
    

    不要忘记将添加的零件缩进渲染到要嵌套的点