假设我有一个名为“Statistics”或“Friends”的 300X300px 块,该块需要一些数据库对象和逻辑操作,这些对象和逻辑操作通常应该放在控制器中,它准备了一些实例变量,这些变量将很好地显示在它的视图/部分中。
可以从我网站中的许多页面调用此块,跨越各种控制器和操作。
我怎样才能解决这个问题,而不需要在控制器中重复代码,也不在视图中放置逻辑。
一个糟糕的解决方案是将 SQL 查询放在视图中,或者使用 iframe,其中单个控制器/操作生成预期的 HTML。
任何想法将不胜感激。
假设我有一个名为“Statistics”或“Friends”的 300X300px 块,该块需要一些数据库对象和逻辑操作,这些对象和逻辑操作通常应该放在控制器中,它准备了一些实例变量,这些变量将很好地显示在它的视图/部分中。
可以从我网站中的许多页面调用此块,跨越各种控制器和操作。
我怎样才能解决这个问题,而不需要在控制器中重复代码,也不在视图中放置逻辑。
一个糟糕的解决方案是将 SQL 查询放在视图中,或者使用 iframe,其中单个控制器/操作生成预期的 HTML。
任何想法将不胜感激。
我认为这是你应该在辅助方法中做的事情。为您使用部分变量而不是实例变量可能是一个好主意,locals以免污染视图的命名空间:
module ApplicatonHelper
def friends_block
friends = Friend.where(...)
# Assuming the 'friends_block' partial is in a directory 'app/views/shared'
render :partial => "shared/friends_block", :locals => {:friends => friends}
end
end
部分将friends_block使用局部变量:
<div id="friends_block">
<% friends.each do |s| %>
...
<% end %>
</div>
其他视图将只使用辅助方法,而不必担心其他任何事情:
<%= friends_block %>
看看 Cells gem: https ://github.com/apotonick/cells
我将块放入部分中,并确保该块所需的实例变量加载before_filter到相关控制器和操作上。