Rails渲染部分和布局在控制器中

我正在重写设计注册控制器的创建操作。 我有两种注册forms,个人或公司,公司有一个名为company_form的字段设置为true,以区分这两种forms。

在表单validation时,我希望呈现正确的表单(以前无论我使用什么forms,它都会回到默认表单)。

我有一个问题,只有部分被渲染(显而易见,因为我只渲染部分),但我需要渲染布局/应用程序文件。

class RegistrationsController < Devise::RegistrationsController def create  if resource.company_form render partial: 'shared/company_signup_form' else render partial: '/shared/individual_signup_form' end end end 

我试过了

 if resource.company_form render partial: 'shared/company_signup_form', layout: 'layouts/application' else render partial: '/shared/individual_signup_form', layout: 'layouts/application end 

但我得到一个错误

 Template is missing Missing partial layouts/_application 

当我指定布局时为什么要查找部分_application,如何才能获得正确的布局

谢谢

编辑

阅读它说的文档

“请注意,partials的布局遵循与常规partials相同的前导下划线命名,并且与它们所属的部分放在同一个文件夹中(不在master layouts文件夹中)。”

但我希望应用默认布局

控制器中的部分呈现最常与Ajax调用一起使用,Ajax调用仅更新页面上的一个或几个元素而无需重新加载。 从控制器渲染部分可以在整页渲染中使用相同的部分模板(通过在模板中调用它)和子页面更新发生时(从响应Ajax调用的控制器操作)。 默认情况下,不使用当前布局。

这可能是您的代码无法工作的原因,您可以使用渲染模板。

模板渲染的工作方式与动作渲染类似,只是它采用相对于模板根的路径。 将自动应用当前布局。

 if resource.company_form render :template => "shared/company_signup_form" else render :template => "shared/individual_signup_form" end 

**从您的部分名称中删除UNDERSCORE,因为您将此作为模板使用。

希望这个有效!

最后(我知道这是一个黑客),但我在我的布局中创建了一个部分名为_partial_layout_wrapper的布局/应用程序文件的精确副本,并在我的控制器中使用它

 render partial: 'shared/company_signup_form', layout: 'partial_layout_wrapper' 

这可行,但肯定不是这样的?

你能发布整个控制器吗? 如果未指定其他布局,则Rails默认呈现layout / application.html.erb。

来自ror指南:

部分布局

部分可以使用自己的布局文件,就像视图可以使用布局一样。 例如,您可以像这样调用部分:

 <%= render partial: "link_area", layout: "graybar" %> 

这将查找名为_link_area.html.erb的部分名称,并使用布局_graybar.html.erb进行渲染。 请注意,partials的布局遵循与常规partials相同的前导下划线命名,并且与它们所属的部分放在同一文件夹中(不在master layouts文件夹中)。

另请注意,显式指定:传递其他选项时需要部分,例如:layout。

所以render partial: 'shared/company_signup_form', layout: 'layouts/application'正在寻找layouts / _application.html.erb