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'
这用于跨多个模型的 show
、new
和 edit
,并按预期显示。 index
有不同的布局。因此,我不能只将这些 div 添加到 application.html.haml
在每个 show
、new
和 edit
视图中都有它似乎不是很干,但是,当我将它放在部分视图中时,我会出错。
如果我使用:
# 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 结构的部分,无论它们的模型或控制器如何:
- 一个用于
new
、edit
和 show
index
一个
这类似于上面显示的 _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' }
我有多个视图,每个视图都包含在一堆 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
在每个 show
、new
和 edit
视图中都有它似乎不是很干,但是,当我将它放在部分视图中时,我会出错。
如果我使用:
# 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 结构的部分,无论它们的模型或控制器如何:
- 一个用于
new
、edit
和show
index
一个
这类似于上面显示的 _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' }