Rails 4个视图位于未为控制器命名的目录中

时间:2015-06-24 14:54:55

标签: ruby-on-rails ruby-on-rails-4

我有两个控制器通过包含相同的模块来执行相同的操作,将它们称为CatUsersController和DogUsersController。我想在app / views / users中共享它们之间的视图。我尝试在控制器中使用ActionView::MissingTemplate: Missing template cat_users/my_action, application/my_action with {:locale=>[:en], :formats=>[:json], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee, :haml]}. Searched in: * "/home/me/my_app/app/views" * "/var/lib/gems/2.1.0/gems/swagger-ui_rails-0.1.7/app/views" * "/var/lib/gems/2.1.0/gems/devise-3.5.1/app/views" * "/home/me/my_app/app/views/users" ,但结果是:

render

因此它开始根据需要查看users /目录,但是它试图在包含视图文件的目录中查找嵌套的cat_users /目录。

我确实通过覆盖def render *args options = args.extract_options! file = options[:action] || params[:action] options[:template] = "/users/#{file}" super(*(args << options)) end 来解决这个问题,就像在August's answer中建议的那样,但这似乎有点矫枉过正:

controller_path

我曾经在Ravenstine's answer中定义use_route方法,这使得控制器在共享用户/目录中查看视图。但是,这导致我的RSpec控制器测试失败,因为他们说没有路由存在,除非我使用def self.controller_path 'users' end ,现在在Rails 4中已弃用:

<body>
<form id="form1" runat="server">
    <div>
        <asp:GridView ID="FileGrid" runat="server" AutoGenerateColumns="False" OnRowCommand="FileGrid_RowCommand">
            <Columns>
                <asp:BoundField DataField="OriginalFileName" HeaderText="OriginalFileName" SortExpression="OriginalFileName" />
                <asp:BoundField DataField="AttachmentGUID" HeaderText="AttachmentGUID" SortExpression="AttachmentGUID" />
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:LinkButton ID="Generate_PDF" runat="server" Text="Generate PDF" CommandName="GeneratePDF_Click" CommandArgument="<%#Container.DataItemIndex %>" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

    </div>
</form>

有没有更好的方法在两个控制器之间共享多个模板?

1 个答案:

答案 0 :(得分:0)

听起来你回到了rails控制器的自动渲染功能。但是,您可以通过指定要渲染的模板/部分作为控制器函数的最后一行来覆盖功能(而不是让控制器隐式渲染,省略该行)

例如,作为CatUsersController的最后一行

render 'users/cat_users/my_action', layout: false