【问题标题】:HAML Rails nested partials not workingHAML Rails嵌套部分不起作用
【发布时间】:2018-07-13 22:56:42
【问题描述】:

我有多个视图,每个视图都隐藏在一堆 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'

正如预期的那样,我得到了在display_panel div 之外/下呈现的form

如果我尝试:

# 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 的部分并使其全部显示为预期的方式?

编辑:

理想情况下,我希望有一组“样式”部分,它们只是为每个视图设置 div/类结构,而不管它们的模型或控制器如何:

  • 一个用于neweditshow
  • 一个index

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

【问题讨论】:

    标签: ruby-on-rails haml


    【解决方案1】:

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

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

    【讨论】:

    • 这意味着在每个视图中都有一个条件渲染表单。虽然这可行,但它似乎“肮脏”。必须有一些标准的方法来做到这一点。这似乎是人们通常会遇到的事情。我认为我们忽略了一些“干净”的方法。使用你的方法,如果我有 7 个控制器和 21 个视图都需要这个 div 树,我的视图中似乎需要一个非常复杂的逻辑才能让它正常工作,这似乎不是 Rails 的方式做事。
    • 你在这点上是绝对正确的。这不是我的意思。我可能根本没有做对。我的想法是您想将一个部分嵌套在另一个部分中,但仅在需要时才显示它。我的意思是display_panel 部分可以在每个控制器模型中使用,但我想每个模型都需要另一种形式!这一事实本身迫使您在每个模型上呈现不同的形式。不过,我可能仍然没有做对:/
    • 不用担心。无论哪种方式,我都很欣赏输入。它帮助我集思广益一个解决方案。我将编辑我的问题以使其更清楚。
    • 在尝试解决方案的过程中,我确实尝试将一个部分嵌套在另一个部分中,但是,无论我将一个部分呈现在另一个部分中还是只是嵌套,它都会引发相同的错误他们使用 HAML 缩进。
    • 这是错误的方法。你绝对不应该在某个视图中创建和维护一个大的if/elsif/elsif/ 树,只是为了有条件地在那里渲染内容。
    【解决方案2】:

    使用content_for 将渲染输出“分配”到特定内容区域:

    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'
    

    new.html.haml

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

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

    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
    

    new.html.haml

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

    【讨论】:

    • 我尝试了前半部分,但失败了。它没有抛出错误,只是使用layouts/application.html.haml 默认值呈现了一个空白页面。然而,在与它斗争了一会儿之后,我回到这里看到了你的编辑,第二部分工作完美!太感谢了!如果您不介意,我在哪里可以了解有关此“更清洁解决方案”的更多信息?我读过的任何一本书或书中都没有看到这一点。
    • 我确实必须将 partial_to_render: 'new' 编辑为 partial_to_render: 'form',但是,我知道你的意思,所以,仍然非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多