Ruby 控制器中局部和布局的Rails渲染

Ruby 控制器中局部和布局的Rails渲染,ruby,layout,ruby-on-rails-4,devise,partials,Ruby,Layout,Ruby On Rails 4,Devise,Partials,我正在覆盖设计注册控制器的创建操作。我有两种注册表单,个人或公司,公司有一个名为company_form的字段设置为true,以区分这两种表单 在表单验证时,我希望呈现正确的表单(以前,无论我使用什么表单,它都会返回到默认表单) 我遇到了一个仅渲染部分的问题(很明显,因为我仅渲染部分),但我还需要渲染布局/应用程序文件 class RegistrationsController < Devise::RegistrationsController def create <!--

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

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

我遇到了一个仅渲染部分的问题(很明显,因为我仅渲染部分),但我还需要渲染布局/应用程序文件

class RegistrationsController < Devise::RegistrationsController
  def create
  <!-- Other devise code here -->
    if resource.company_form
      render partial: 'shared/company_signup_form'
    else
      render partial: '/shared/individual_signup_form'
    end
  end
end
但我犯了个错误

Template is missing
Missing partial layouts/_application 
当我指定布局时,为什么它要寻找部分应用程序?我如何才能获得正确的布局来应用

谢谢

编辑

阅读上面的文档

请注意,分区的布局与常规分区遵循相同的前导下划线命名,并与它们所属的分区放在同一文件夹中(不在主布局文件夹中)


但是我希望应用默认布局

控制器中的部分呈现最常用于Ajax调用,这些调用只更新页面上的一个或几个元素而不重新加载。通过从控制器呈现部分,可以在整个页面呈现(通过在模板内调用)和子页面更新(通过响应Ajax调用的控制器操作)中使用相同的部分模板。默认情况下,不使用当前布局

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

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

if resource.company_form
   render :template => "shared/company_signup_form"
else
   render :template => "shared/individual_signup_form"   
end
**将下划线从您的partail名称中删除,因为您将其用作模板

希望这能奏效

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

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

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

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

从ror指南中:

局部布局

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

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

这将查找名为_link_area.html.erb的部分并呈现它 使用布局_graybar.html.erb。请注意,分区的布局 使用与常规部分相同的前导下划线命名,并且 与它们所属的分部放在同一文件夹中(不在 主布局文件夹)

还要注意,传递时需要显式指定:partial 其他选项,例如:布局

因此,
render partial:'shared/company\u signup\u form',layouts:'layouts/application'
正在查找layouts/\u application.html.erb

您可以使用内联:

render inline: '<%= render "dir/partial" %>', layout: 'layouts/application'
呈现内联:“”,布局:'layouts/application'

layouts/application假设要为正在呈现的所有部分或任何页面运行,这是视图模块的母版页。如果你想在两种不同的情况下使用不同的布局,那么你可以在应用程序控制器中编写一个条件。这就是我实际上只想让主布局呈现的东西,但它不使用这个作为ref,这可以解决你的问题吗?这是正确的语法,但我不在视图中,我在控制器中(Desive的注册管理员)不幸的是,布局/应用程序被渲染了两次,部分完全没有渲染检查编辑后的答案,希望这对您有用Hanks,今天学习了一些关于模板的新知识,您的答案更有效,更“正轨”如上所述,如果希望应用程序布局显示在部分中,则需要将文件作为模板而不是部分呈现。请注意,如果在文件名中使用下划线,请添加下划线。我的示例使用了现代语法:呈现模板:“问题/_结果”。
render inline: '<%= render "dir/partial" %>', layout: 'layouts/application'