Rails - 从控制器中删除视图逻辑

时间:2011-01-09 12:56:56

标签: ruby-on-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 个答案:

答案 0 :(得分:2)

你控制器中唯一应该拥有的是:

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

并在您的磁盘模型中添加类似

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

其他所有内容都应该在您传递磁盘变量的辅助方法中,并返回视图的计算结果。 @search实例变量不是必需的,因为params在视图和辅助方法中可用。

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

类似的东西:

#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添加方法来定义辅助方法。

如果我可以诚实地建议您购买一本书并通过它来完成。我可以保证你会享受学习铁轨的经验,让自己更轻松,从长远来看节省大量时间。

答案 1 :(得分: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)

我认为它可以改进,但我不知道如何。如果有人能提出建议,我会很高兴: - )