2011-08-12 3 views
1

私は気が利いているヘルパーを持っていますが、私はそれを改善する方法を考えることができませんでした。ここで問題になっているヘルパーです:Rails:Helper Refactoring

# Shows Admin Menu Button 
def admin_toggle_button 
    if user_signed_in? && (current_user.has_role?(:admin) || (@collection && can?(:curate,@collection))) 
    if session[:admin_menu] == :on 
     link_to('Admin Tools', edit_shared_path(:admin_menu => :off), :remote=>true, :class => 'selected', :id => 'admin_toggle_button', :title => 'Hide Admin Menu') 
    else 
     link_to('Admin Tools', edit_shared_path(:admin_menu => :on), :remote=>true, :id => 'admin_toggle_button', :title => 'Show Admin Menu') 
    end 
    end 
end 

自分のアプリケーションのメニューバーには、私はadmin_toggle_button呼び出しはこのヘルパーは、そのボタンがその状態が何であるかに存在することとすべきか否かを判断します。

管理者用メニューボタンを表示するには、ログインしているユーザーがいる必要があります。そのユーザーは管理者である必要があります。また、ユーザーは自分が編集や編集を許可されているコレクションを表示する必要があります。

私の質問は:このようなヘルパーメソッドは通常どおりですか?つまり、この複雑なメソッドが必要と思われるのですか?何か不足していますか?この方法を改善する方法を提案できますか?

+0

私はそのヘルパーメソッドを骨格に関連付けられた特定のヘルパーファイルのヘルパー内に持つことは大丈夫だと思います。 – rookieRailer

答えて

3

最初の条件は、別の場所で再利用できるようにすることができます。

def can_view_admin_stuff? 
    user_signed_in? && (current_user.has_role?(:admin) || (@collection && can?(:curate,@collection))) 
end 

def admin_toggle_button 
    return '' unless can_view_admin_stuff? 

    if session[:admin_menu] == :on 
    link_to('Admin Tools', edit_shared_path(:admin_menu => :off), :remote=>true, :class => 'selected', :id => 'admin_toggle_button', :title => 'Hide Admin Menu') 
    else 
    link_to('Admin Tools', edit_shared_path(:admin_menu => :on), :remote=>true, :id => 'admin_toggle_button', :title => 'Show Admin Menu') 
    end 
end 

しかし、ええ、私は、あなたがリンクの条件だけを使用している場合は特にそうです。コードの他の部分に使用している場合は、そのためのヘルパーを持っていることがうれしいでしょう。

+0

これはかなり意味があると思います。私は通常何らかの理由で複数のメソッドに分割することを考えるのが遅いですが、しばしばそれははるかに読みやすいコードを生成します。提案していただきありがとうございます! – Andrew

0

この方法はあまり複雑ではありません。最も複雑な部分はアクセスチェックであり、それでもそれほど悪くはありません。ヘルパーの理由の1つは、そのようなものをあなたの意見から守って、何か悪いことをしていないようにすることです。

2つのlink_toバリアント間の繰り返しに注意が必要な場合があります。あなたはそれを少しけどを再構築できます。

def admin_toggle_button 
    return '' if !user_signed_in? || !(current_user.has_role?(:admin) || (@collection && can?(:curate,@collection))) 
    opts = { 
    :id  => 'admin_toggle_button', 
    :remote => true, 
    :title => 'Show Admin Menu' 
    } 
    admin_menu = :on 
    if session[:admin_menu] == :on 
    opts[:title] = 'Hide Admin Menu' 
    opts[:class] = 'selected' 
    admin_menu = :off 
    end 
    link_to('Admin Tools', edit_shared_path(:admin_menu => admin_menu), opts) 
end 

このアプローチは、2回の可能なlink_toのコールとの違いを強調しています。 session[:admin_menu] != :onがもっと一般的な場合は、optsadmin_menuを「管理者メニューを隠す」設定でロジックを逆にして、必要に応じて!= :onケースに調整することができます。

def admin_toggle_button 
    return '' if !user_signed_in? || !(current_user.has_role?(:admin) || (@collection && can?(:curate,@collection))) 
    opts = { 
    :class => 'selected', 
    :id  => 'admin_toggle_button', 
    :remote => true, 
    :title => 'Hide Admin Menu' 
    } 
    admin_menu = :off 
    if session[:admin_menu] != :on 
    opts[:title] = 'Show Admin Menu' 
    opts.delete(:class) 
    admin_menu = :on 
    end 
    link_to('Admin Tools', edit_shared_path(:admin_menu => admin_menu), opts) 
end 
+0

これは本当に面白いですし、私はそれがどのように動作するのが好きですが、私は助けることができませんが、実際にこの方法を構造化するためにはもっと多くのコード行が必要であることに気づくことはできません...このアプローチを考えました。共有ありがとう! – Andrew

+0

@Andrew:「コードの行」は、品質、明快さ、簡潔さ、または簡潔さとは関係ありません。 –

関連する問題