2011-01-09 70 views
0

我是一名初学者。我工作在一个小应用程序,我有一个设计问题。 我认为我的观点太多了,不应该这样做。Rails - 从控制器中删除查看逻辑

这里我的控制器:

 
if params[:search] 
    @hosts=Host.all 
    @total = {} 
    @total_by_group={} 
    @search=true 
    Disks.search(params[:search]).each do |disk| 
    if @total[disk.host.name] 
     @total[disk.host.name]+=disk.capacity 
    else 
     @total[disk.host.name]=disk.capacity 
    end 
    if @total_by_group[disk.group.name] 
     @total_by_group[disk.group.name]+=disk.capacity 
    else 
     @total_by_group[disk.group.name]=disk.capacity 
    end 
end 
end 

而我的观点:

 
- if @search 
    - @hosts.each do |host| 
    - if @total[host.name] 
     %br 
     %table 
     %tr 
      %th host 
      %th total size 
      - host.groups.each do |group| 
      - if @total_by_group[group.name] 
      %th=group.name 
     %tr 
      %td=host.name 
      %td=sprintf("%0.02f", @total[host.name]) 
      - host.groups.each do |group| 
      - if @total_by_group[group.name] 
      %td=sprintf("%0.02f", @total_by_group[group.name]) 

它工作正常,但感觉不对。我认为我的观点需要更加简单。

我搜索了一下,我发现了一些解决方案,其中人们建立了一个模型来存储结果,但它似乎对我来说过分矫枉过正,当我更改我的请求并需要清理某些方法时,在模式上添加了大量作品一段时间后的表格。

什么是轨道做这样的事情?

感谢

阿兰

回答

2

真的,你应该在你的控制器的唯一事情是这样的:

if params[:search] 
    @disks = Disks.custom_search(params[:search]) 
end 

,并在你的硬盘型号类似

def custom_search term 
    find_by_field(term, :include => :host) 

其他一切应该在你传递磁盘变量的辅助方法中并返回视图的计算结果。 @search实例变量不是必需的,因为视图和帮助器方法中可以使用参数。

好的,你告诉我这个第一个例子应该在模型中。请记住,模型数据的任何表示都应该来自您的模型,甚至是未存储在数据库中的数据的计算。

是这样的:

#view 
- @disks.collect(&:host).each do |host| 
    - host.groups.each do |group| 
    = group.name 
    = group.disks_capacity   

#your model group.rb 
def disks_capacity 
    disks.map{|disk| disk.capacity}.sum # with disks.map we're talking about the disks which belong to this instance of group 
end 

甲辅助方法是通过添加的方法,以一个xyz_helper.rb限定。

如果我可以提出一个诚实的建议,你买了一本书,并通过它。我可以保证你会喜欢学习rails的经验,让自己的事情变得更容易,并且长期节省大量时间。

+0

谢谢。我不确定如果我正确理解我如何定义辅助方法,但它似乎更像我想要的。我会尝试。 – 2011-01-09 14:54:39

0

我试图根据mark的评论改进一点我的代码。

我删除了从控制器的一些代码:

 
    if params[:search] 
     @disks= Disks.custom_search(params[:search]) 
    end 

我加了一些助手:

 

def host_total(host) 
    @disks.host(host).sum(:capacity) 
end 

def list_hosts 
    @disks.joins(:hosts).group("hosts.name").select("hosts.name") 
end 

def list_dgroup_by_host(host) 
    @disks.host(host).group("dgroups.name").select("dgroups.name") 
end 

def capacity_by_dgroup(group) 
    @disks.by_dgroup(group).sum(:capacity) 
end 

在这里,我的部分观点:

 
- list_hosts.each do |host| 
    %br 
    %table 
    %tr 
     %th host 
     %th total size 
     - list_dgroup_by_host(host.name).each do |group| 
     %th=group.name 
    %tr 
     %td=host.name 
     %td= host_total(host.name)) 
     - list_dgroup_by_host(host.name).each do |group| 
     %td=capacity_by_dgroup(group.name) 

我认为可以提高,但我看不出如何。如果有人可以提出建议,我会很高兴:-)