在 Rails 中嵌套资源时的不同视图

Posted

技术标签:

【中文标题】在 Rails 中嵌套资源时的不同视图【英文标题】:Different views when nesting resources in Rails 【发布时间】:2012-03-22 16:11:52 【问题描述】:

我正在使用 Rails 3.2.1。

在使用嵌套资源时是否可以使用不同的视图?即profile/cmets post/cmets。假设您希望两个页面看起来完全不同。有没有办法做到这一点,而无需在每个控制器操作中覆盖渲染?

最好还是想用respond_with。

【问题讨论】:

【参考方案1】:

我没有找到任何东西,最后我是通过以下方式完成的:

class NestedController < ApplicationController

  before_filter :retrieve_parent
  before_filter :retrieve_scope

  layout :retrieve_layout

  def retrieve_scope
    @scope = @parent.nil? ? controller_name : @parent.class.name.pluralize.downcase || ''
  end

  def retrieve_view
    controller_name + '/' + @scope + '/' + action_name
  end

  def retrieve_parent
    params.each do |name, value|
      if name =~ /(.+)_id$/
        @parent = $1.classify.constantize.find(value)
      end
    end
  end

  def retrieve_layout
   template_exists?(@scope, 'layouts') ? @scope : 'application'
  end

end

每个使用嵌套资源的控制器都将从 NestedController 扩展。

请注意,retrieve_parent 函数源自 Ryan 关于多态关联的 railscast。

希望这对某人有所帮助。

【讨论】:

【参考方案2】:

我遇到了同样的问题,我所做的就是首先拆分控制器,如下所示:

https://***.com/a/14947230/1641163

然后我为每个嵌套控制器提供了一个单独的视图。当您运行rails generate controller Profile_Comments new create index 时,您会在正确的目录中获得相应的视图和帮助程序(或者您当然可以直接创建它们并手动将它们放在那里),这些是默认情况下将呈现的视图。

【讨论】:

以上是关于在 Rails 中嵌套资源时的不同视图的主要内容,如果未能解决你的问题,请参考以下文章

使用嵌套资源干燥 Rails 视图

带有视图测试和嵌套资源的 Rspec 和 Rails

如何更新脚手架生成的 MVC + 路由,用于在 Rails 中具有 2 个 belongs_to 关系的嵌套资源

Rails 3 link_to 路由(编辑)嵌套资源

Rails 不区分嵌套在相同命名空间中的两个资源

Rails 4 [最佳实践] 嵌套资源和浅层:true