Контроллер рефакторинга - PullRequest
       4

Контроллер рефакторинга

0 голосов
/ 17 ноября 2011

Как я уверен, вы можете сказать по следующему коду, я новичок.Но мне удалось заставить это работать правильно ...

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

Большое спасибо заранее ...

current_controller = params[:controller]

if current_controller == "menus" && params[:id].present?
    @menu = Menu.find(params[:id])
elsif current_controller == "menus" && params[:id].nil?
    @menu = Menu.first
elsif current_controller == "items" || current_controller == "categories"
    @menu = Menu.find(params[:menu_id])
else
    @menu = Menu.last           
end

Ответы [ 3 ]

2 голосов
/ 17 ноября 2011

Наивный перевод в (немного) меньший код:

current_controller = params[:controller]
@menu = if current_controller == "menus"
          params[:id].present? Menu.find(params[:id]) : Menu.first
        elsif current_controller == "items" || current_controller == "categories"
          Menu.find(params[:menu_id])
        else
          Menu.last           
        end

Где этот код находится?

Было бы более разумно иметь это в контроллере базового приложения или фильтреи т. д. и переопределить в трех контроллерах, которые имеют специальный корпус?Или это завернуто в помощника, или ...?

Редактировать Используя Procs.

# Default if hash entry not found.
menus = Hash.new(Proc.new { |p| Menu.last })

# Items and categories controllers
itemcats = Proc.new { |p| Menu.find(p[:menu_id]) }
menus["items"] = menus["categories"] = itemcats

# Menus controller
menus["menus"] = Proc.new { |p| p[:id] ? Menu.find(p[:id]) : Menu.first }

@menu = menus[params[:controller]].call(params)

(Больше или меньше.)

1 голос
/ 17 ноября 2011

Это не проверено, но вы можете попробовать использовать оператор case, как сказал Дэвеньютон

# Case on an expression:
@menus = case params[:controller]
when "menus" && params[:id].present? then Menu.find(params[:id])
when "menus" && params[:id].nil? then Menu.first
when "items", "categories" then Menu.find(params[:menu_id])
else Menu.last           
end

Вы можете заменить "then" на точки с запятой, если вы предпочитаете

1 голос
/ 17 ноября 2011

Это мой рефакторинг к вашему коду:

@menu = case controller.controller_name
        when "menus"
            if params[:id]
                Menu.find(params[:id])
            else
                Menu.first
            end
        when "items" || "categories"
            Menu.find(params[:menu_id])
        else
            Menu.last
        end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...