Rails - удалить логику вида из контроллера - PullRequest
0 голосов
/ 09 января 2011

Я новичок на рельсах.Я работаю над небольшим приложением, и у меня проблема с дизайном.Я думаю, что у меня слишком много логики на мой взгляд, и это не должно быть сделано так.

Вот мой контроллер:

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])

Он работает правильно, но не чувствует себя хорошо.Я думаю, что мой взгляд должен быть более простым.

Я искал и нашел несколько решений, в которых люди строят модель для хранения результатов, но мне кажется, что это излишне, и я добавляю много работ по схеме, когда яизмените мои запросы, и через некоторое время мне понадобится какой-нибудь способ очистить таблицу.

Как это сделать? - 1013 *

Спасибо

Алена

Ответы [ 2 ]

2 голосов
/ 09 января 2011

На самом деле единственное, что вы должны иметь в своем контроллере, это:

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

, а в вашей модели дисков что-то вроде

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

Все остальное должно быть во вспомогательных методах, к которымВы передаете переменную disk и возвращаете вычисленный результат для просмотра.Переменная экземпляра @search не обязательна, так как параметры доступны в методах view и helper.

Хорошо, из того, что вы мне сказали, этот первый пример должен быть в модели.Помните, что любое представление данных модели должно исходить из ваших моделей, даже вычисления данных, которые не хранятся в вашей базе данных.

Что-то вроде:

#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.

Если я могу честно предложить вам купить книгу и проработать ее.Я могу гарантировать, что вам понравится опыт обучения рельсам, что упростит вам задачу и сэкономит много времени в долгосрочной перспективе.

0 голосов
/ 10 января 2011

Я попытался немного улучшить свой код, основываясь на комментариях Марка.

Я удалил некоторый код из контроллера:

    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)

Я думаю, что это можно улучшить, но я не понимаю, как. Если кто-то может что-то предложить, я буду рад: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...