如果对象存在,则渲染关联对象

Posted

技术标签:

【中文标题】如果对象存在,则渲染关联对象【英文标题】:render an associated object if the object exists 【发布时间】:2015-01-21 15:27:02 【问题描述】:

如果关联已定义,我正在尝试在我的助手上创建一个通用方法来呈现父对象关联。

下面是一些示例代码: 第一个方法显式呈现关联。下一个方法尝试通用(这个父对象有 9 个关联,所以我认为编写 9 个渲染方法不会 DRY。)

module SurveysHelper

  def render_demographics_part(survey)
    render survey.demographics_part if survey.demographics_part
  end

  def gen_renderer(part, survey)
    render survey.part if survey.part
  end

end

【问题讨论】:

您可以直接调用您的视图render(survey.part) || content_tag(:p, 'No part found')。对于每个关联,您必须定义一个与该关联类似的部分名称。以demographics_part 为例,您的视图中必须有一个名为demographics_parts 的文件夹,并且在该文件夹中,当您调用render(survey. demographics_part) 名称_demographics_part .html.erb 时将呈现部分内容。 @Octopus-Paul,听起来你在说我必须明确渲染这些部分。您的示例render(survey.part) || content_tag(:p, 'No part found') 将不起作用,因为未定义survey.part。必须是render(survey.demographics_part) || content_tag(:p, 'no part found') 还是我错过了你的意思? 我使用survey.part 只是为了通用。看看这里speakerdeck.com/carlosantoniodasilva/… 在第 98 和第 99 幻灯片,以获得更好的解释 【参考方案1】:

我是这样做的:

def gen_renderer(part, survey)
  if part.nil?
    content_tag(:p, 'incomplete')
  else
    render part
  end
end

我忘了part 只是一个对象引用——它是什么并不重要,只要它知道如何渲染自己(你需要在对象的视图路径中有一个部分——app/views/demographics_part/_demographics_part.html.erb

它有效,但可能有更好的方法。

【讨论】:

以上是关于如果对象存在,则渲染关联对象的主要内容,如果未能解决你的问题,请参考以下文章

关联与依赖的区别

对象不再存在后如何销毁与对象关联的数据?

如何优雅地检查对象和关联对象的存在?

将rails多态关联对象渲染为JSON

查找所有关联断开的对象

Java程序员校招蚂蚁金服,java分库关联查询的工具