我有多个视图,每个视图都隐藏在一堆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
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,无论其模型或控制器如何:
new
,edit
和show
index
这就像上面显示的_display_panel.html.haml
。
我还希望能够基于他们当前使用的模型在此之后呈现部分表单。我不想把所有逻辑确定为部分中的模型和方法。
答案 0 :(得分:4)
使用content_for
来"分配"将输出呈现到特定内容区域:
.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)
= 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'
- content_for :display_panel do
= render 'form'
= render 'shared/display_panel'
即使您不了解content_for
,更清洁的解决方案是"推送"使用" locals"进入视图的部分名称变量:
.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
= 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
不要忘记缩进将添加的部分渲染到您想要嵌套的位置