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

时间:2014-09-09 07:23:05

标签: ruby layout ruby-on-rails-4 devise partials

我正在覆盖设计注册控制器的创建操作。我有两种注册形式,个人或公司,公司有一个名为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

我试过了

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 

为什么在指定布局时它会寻找部分_应用程序?如何才能获得正确的布局?

由于

修改

阅读它所说的文件

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

但我希望应用默认布局

4 个答案:

答案 0 :(得分:6)

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

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

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

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

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

希望这有效!

答案 1 :(得分:3)

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

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

这有效,但肯定不是这样的吗?

答案 2 :(得分:1)

你能发布你的整个控制器吗?如果未指定另一个布局,则Rails默认渲染layout / application.html.erb。

来自ror指南:

  

部分布局

     

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

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

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

     

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

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

答案 3 :(得分:0)

您可以使用内联:

render inline: '<%= render "dir/partial" %>', layout: 'layouts/application'