【问题标题】:how to dry up 2 almost identical methods that are used in almost every controller?如何干掉几乎每个控制器中使用的两种几乎相同的方法?
【发布时间】:2013-05-29 11:26:53
【问题描述】:

在我的大多数 Rails 控制器中,我使用 2 种方法来设置布局和 sub_layout 感觉很乱,重复很多 == 不干(几乎每个控制器都有方法)。

我正在寻找一些关于如何干燥此代码的建设性建议

Profile_controller.rb:

class ProfilesController < ApplicationController

  before_filter :authenticate_user!
  layout        :resolve_layout

    def resolve_layout
        case action_name
          when "show"
            if user_signed_in?
              "application"
            else
              "application"
            end
          when "get_info"
            "modal"
          else
            "application"
        end
      end

      def sub_layout
        case params[:action]
          when "index"
            if user_signed_in?
              "left"
            else
              "right"
            end
          when "show"
            if user_signed_in?
              "left"
            else
              "right"
            end
          else
            "left"
        end
      end

      ..etc

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 refactoring dry


    【解决方案1】:
    class LayoutHandler < Struct.new(:action, :user_signed_in)
    
      def resolve
        case action
        when "get_info" then "modal"
        else "application"
        end
      end
    
      def sub
        case action
        when "index", "show" then user_signed_in? ? "left" :"right"
        else "left"
        end
      end
    end
    

    在您的控制器中:

    layout :resolve_layout
    
    def resolve_layout
      LayoutHandler.new(params[:action], user_signed_in?).resolve
    end
    

    【讨论】:

    • 您能否解释一下它的作用和工作原理?亲切的问候。例如在哪里存储处理程序
    • 它和你的代码一样,只是抽象在你的控制器之外。我会把它放在lib/controller_helpers
    • 好清楚,您需要控制器内部的文件在顶部还是“自动”加载到 rails 3 中?
    • 为什么不把它放在 /app/helpers 似乎更符合逻辑的地方?
    • 一个助手应该是一个模块,它的功能在视图中使用。所以不适合我。但请随意
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多