0

我的应用程序中的每个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。有没有更好的办法?

4

1 回答 1

0

您可以为此使用演示者。通过这种类型的对象可以更好地为模型添加“视图”逻辑。看看draper

装饰资源后,您可以调用visible_attributes或其他任何方法。当然,您需要为每个资源实现该方法。

视图继承在寻找视图时起作用,而不是在渲染时起作用。看看原来的插件实现

另一种方法是让show父视图调用renderresource为类创建几个部分。

为了更好地理解 Rails 视图,我推荐Rails 视图:创建美观且可维护的用户体验

于 2012-11-07T16:47:39.330 回答