我的应用程序中的每个show
操作对每个模型都有相同的模板(它是一个管理员门户类型的界面)。我show.html.erb
认为所有这些模型都继承了。
控制器都使用 InheritedResources,因此我可以访问一些辅助变量,例如resource
,我用它来显示resource.attributes
在我的父视图中显示的模型的属性。
我想做的是将每个模型中显示的属性列入白名单。我想到了两种方法来做到这一点......第一种是在我的模型继承的类中定义一些方法,比如说它被调用attr_visible
并定义模型中的每个属性。我不喜欢这种方法的原因是它在模型中放置了太多的视图逻辑。我宁愿将我的视图与模型一起提供,并让视图确定显示的内容。
第二种方法就是这个问题的意义所在。我想要一个文件/app/views/users/show.html.erb
,并为我想显示的用户设置哪些属性,比如:
@attributes = [:name, :email, :etc]
然后将它们传递给我在这个问题开头描述的父视图。然后,该视图将能够循环@attributes
并显示必要的属性。
super
是否可以从视图中使用“ ”类型的方法?我读过的关于视图继承的所有内容都表明视图是根据它在目录结构中的位置加载的,然后你就不走运了。
编辑:我已经做了我想做的事。我在 /app/views/users 目录中定义了部分 _show.html.erb,如下所示:
<% @attributes = ['name', ...] %>
然后在父视图中我<%= render "show" %>
在循环之前调用@attributes
. 这行得通,但感觉很笨拙,因为我在调用时实际上并没有渲染任何东西render
。有没有更好的办法?