2012-01-15 26 views
0

我建立有多个型号,其中一个项目是一个Rails应用程序变量。什么是确定正确的方式提出申请范围内的部分和在轨

项目中包含的产品和支持信息的短名单。

我需要显示的应用程序的每个页面上此信息。在我的意见我已经添加

<%= render @items %> 

然后

加分“项目/ _item.html.erb”

现在,为了得到这一切的工作,我还需要定义变量

@items = Item.all 

我的问题是,什么是定义这个变量的正确方法?我可以将这一行添加到每个控制器的每个视图中,但这看起来不太干燥。

我应该在应用程序控制器中定义这个吗?如果是这样,如果我还想保持对项目索引页面的访问,这是否会导致任何问题?

对不起,如果这是一个简单的问题。我试图想通过最好的方法,并没有发现太多关于这个案件的书面。感谢新鲜的想法和观点!

谢谢!

回答

3

绝对不应该从视图调用数据库。

您可以创建内部应用控制器私有方法,并把它作为的before_filter为需要收集@items所有控制器。 最可能的是,你应该自定义哪里@items应该填充操作,如:

before_filter :load_items, :only => [:show, :edit, update] 
+0

感谢@taro这正是我所期待的。感谢您向我展示道路。我在应用程序控制器中添加了'before_filter:load_items',并且在这个'def load_items @items = Item.all end'下面添加了。奇迹般有效! – 2012-01-15 12:37:41

0

我认为最简单的办法是建立一个新的部分(假设我们把它称为“items_box”)。在您的items/_items_box.html.erb中,您将@items定义为Item.all,并提供您需要的任何渲染代码。然后,你所要做的就是将<%= render @items %>更改为<%= render 'items/items_box' %>

+0

感谢马克,我遇到的问题是我无法弄清楚如何从部分内部定义@items。你能告诉我你将如何做到这一点?谢谢你帮助我学习 – 2012-01-15 12:39:32

+0

好吧,如果你打算这样做,它只会是一个读取'_items_box.html.erb'顶部的<%= @items = Item.all%>'的行'文件。但是,我认为太郎的方法是一个更清洁的方法;他认为View层不应该处理数据库请求。:) – 2012-01-15 12:46:14

1

如果你需要显示的东西,你应该考虑这样做在应用程序控制器,而不是在所有不同的控制器,你可以在布局做视图部分(因为通过了应用程序是常见的)。你可以有部分在同一文件夹(即布局),并调用它在布局视图

<%= render :partial => 'partial_name' %> 

既然你已经这样做了,在应用层面,你需要我不认为从您应用中的任何其他位置呈现此部分。

+0

感谢wahaj,我也觉得这应该在应用程序控制器中处理,只是不知道该怎么做。太郎的建议让我觉得正确 – 2012-01-15 12:40:50

相关问题