我有一个问题,试图在我的申请中保持ar查找器干燥。我创建了一个博客应用程序,当用户第一次浏览博客时,它会获取所有相关的页面、帖子、链接、标签和类别。博客控制器的显示操作示例如下所示:
def show
#find blog by user name
@user= User.find_by_login(params[:id])
@blog= @user.blog
@posts = Post.status("publish",@user).find(:all, :order => "created_at DESC")
@tags = @user.tags
@pages = Page.status("publish",@user).find(:all, :order => "created_at DESC")
@links = @user.links.public_link.find(:all, :order => 'created_at DESC')
@archives = @posts.group_by(&:month)
@categories = @user.categories.group_by(&:name)
session[:found_user][email protected]
render :layout=>false
end
正如您所看到的,这并不是很枯燥,因为在控制器中还有其他的动作调用相同的实例变量,比如@tags等。
我怎么能让这个更干?我试着把它移到blog模型中,但仍然需要调用控制器中的各种实例变量,比如@tags等。
当博客第一次被调用时,是否有方法存储所有这些变量,并在控制器和操作之间重用它们?
谢谢你的建议。我用的是Rails 2.1
最佳答案
我在一个博客上读到,只是用helper方法替换before过滤器(或者在controller方法中加载所有类型的数据)。像这样的:
class BlogsController < ApplicationController
def show
session[:found_user][email protected]
render :layout=>false
end
helper_method :user, :blog, :posts, :tags, :pages, :links, :archives, :categories
protected
def user
@user ||= User.find_by_login(params[:id])
end
def blog
@blog ||= user.blog
end
def posts
@posts ||= Post.status("publish", user).find(:all, :order => "created_at DESC")
end
def tags
@tags ||= user.tags
end
def pages
@pages ||= Page.status("publish", user).find(:all, :order => "created_at DESC")
end
def links
@links ||= user.links.public_link.find(:all, :order => 'created_at DESC')
end
def archives
@archives ||= posts.group_by(&:month)
end
def categories
@categories ||= user.categories.group_by(&:name)
end
end
## app/views/blogs/show.html.erb
<p>Name: <%=h user.name %></p>
<h3><%= posts.length %> Posts</h3>
<% posts.each do |post| %>
...
<% end %>
<ul>
<% categories.each do |category| %>
<li><%=h category %></li>
<% end %>
</ul>
查看如何在视图中使用任何简单的数据库调用。此解决方案的一个优点是,未调用的helper方法不会占用操作时间。
如有必要,将助手方法抽象到模块中,并将该模块包含在applicationcontroller中。