2011-01-09 5 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]) 

それが正常に機能していますが、右に感じることはありません。私の見解はもっとシンプルにする必要があると思う。

私は検索して、結果を保存するモデルを構築するいくつかのソリューションを見つけましたが、私には過度のものであり、要求を変更してクリーンアップする必要があるときに、テーブルはしばらくしてから。

このようなことをするためのレールの仕組みは何ですか?

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

とあなたのディスクのモデル内の他の

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

すべてのようなもの:

アラン

答えて

2

が本当にあなたのコントローラであなたが持つべき唯一のものはこれです

感謝ディスクの変数を渡すヘルパーメソッドでなければなりませんビューの計算結果が返されます。 paramsはビューメソッドとヘルパーメソッドで使用できるため、@searchインスタンス変数は不要です。

おかげさまで、この最初の例はモデルにあるはずです。モデルデータの表現は、データベースに格納されていないデータの計算であっても、モデルから得られる必要があります。

のようなもの:ヘルパーメソッドがxyz_helper.rbにメソッドを追加することによって定義される

#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 

あなたが本を購入してそれを処理するという正直な提案をすることができます。レールを学ぶ経験をお楽しみいただき、長期的には多くの時間を節約できるように、私はあなたに保証します。

+0

ありがとう。私はヘルパーメソッドを定義する方法を正しく理解しているかどうかはわかりませんが、もっと好きなようです。試してみます。 –

+0

ビューに必要なものの擬似コードを書くと、いくつかのポインタを貸せてうれしいです。 :) – mark

+0

それはそれのようなものです:各ホストのために、ディスクがグループ "group1"に属しているすべてのディスク容量の合計を表示します。 –

0

マークのコメントに基づいて少し改善しました。

私は、コントローラからいくつかのコードを削除:

 
    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) 

私はそれを向上させることができると思いますが、私はどのように表示されません。誰かが何かを提案できれば、私はうれしいでしょう:-)