我有两个控制器通过包含相同的模块来执行相同的操作,将它们称为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>
有没有更好的方法在两个控制器之间共享多个模板?
答案 0 :(得分:0)
听起来你回到了rails控制器的自动渲染功能。但是,您可以通过指定要渲染的模板/部分作为控制器函数的最后一行来覆盖功能(而不是让控制器隐式渲染,省略该行)
例如,作为CatUsersController的最后一行
render 'users/cat_users/my_action', layout: false