有没有一种方法可以删除一组函数调用,如下所示?
def set_area_vars
@leftarea1 = hstore_string_to_hash(@webcast.leftarea1) if @webcast.leftarea1.present?
@midarea1 = hstore_string_to_hash(@webcast.midarea1) if @webcast.midarea1.present?
@leftarea2 = hstore_string_to_hash(@webcast.leftarea2) if @webcast.leftarea2.present?
@midarea2 = hstore_string_to_hash(@webcast.midarea2) if @webcast.midarea2.present?
@rightarea2 = hstore_string_to_hash(@webcast.rightarea2) if @webcast.rightarea2.present?
@resource1 = webcast_area_convert_resources(@leftarea1) if @leftarea1
@resource2 = webcast_area_convert_resources(@midarea1) if @midarea1
@resource3 = webcast_area_convert_resources(@leftarea2) if @leftarea2
@resource4 = webcast_area_convert_resources(@midarea2) if @midarea2
@resource5 = webcast_area_convert_resources(@rightarea2) if @rightarea2
end
以下代码:
def sidebar_menu(top_level = ["Venues", "globe"], menu_class = "venue-nav", menu_items = [[venues_dashboard_path, "Dashboard"]], expanded = false)
@sidebar_menu_item ||= []
@menu_items ||= []
add_sidebar_menu(top_level, menu_class, @menu_items.concat(menu_items), expanded)
if user_signed_in?
if current_user.has_role? :admin
@hide_sidebar = 'hide-sidebar' if current_user.has_role? :visitor if user_signed_in?
add_sidebar_menu ["Users", "users"], "user-nav", [[users_path, "List users"], [new_user_path, "Create a user"], [new_user_invitation_path, "Invite user"]], false unless params[:controller] == 'users'
add_sidebar_menu ["Forums", "comments"], "forum-nav", [[forums_path(@venue), "List forums"], [new_forum_path(@venue), "Create a forum"]], false unless params[:controller] == 'forums'
add_sidebar_menu ["Resources", "pencil"], "literature-nav", [[literatures_path(@venue), "List resources"], [new_literature_path(@venue), "Create a resources"]], false unless params[:controller] == 'literatures'
add_sidebar_menu ["Partners", "user"], "partner-nav", [[partners_path(@venue), "List partner"], [new_partner_path(@venue), "Create a partner"]], false unless params[:controller] == 'partners'
add_sidebar_menu ["Sponsors", "user"], "sponsors-nav", [[sponsors_path, "List sponsors"], [new_sponsor_path, "Create a sponsor"]], false unless params[:controller] == 'sponsors'
add_sidebar_menu ["Presentations", "beer"], "presentation-nav", [[presentations_path(@venue), "List presentations"], [new_presentation_path(@venue), "Create a presentation"]], false unless params[:controller] == 'presentations'
add_sidebar_menu ["Products", "gift"], "product-nav", [[products_path(@venue), "List products"], [new_product_path(@venue), "Create a product"]], false unless params[:controller] == 'products'
add_sidebar_menu ["Videos", "video-camera"], "video-nav", [[videos_path, "List videos"], [new_video_path, "Create a video"]], false unless params[:controller] == 'videos'
add_sidebar_menu ["Templates", "folder"], "templates-nav", [[templates_path(@venue), "List templates"], [new_template_path(@venue), "Create a template"]], false unless params[:controller] == 'templates'
add_sidebar_menu ["Q&A Chats", "comments-o"], "moderated-chats-nav", [[moderated_chats_path(@venue), "List chats"], [new_moderated_chat_path(@venue), "Create a chat"]], false unless params[:controller] == 'moderated_chats'
elsif current_user.has_role? :vendor
add_sidebar_menu ["Forums", "comments"], "forum-nav", [[forums_path(@venue), "List forums"], [new_forum_path(@venue), "Create a forum"]], false unless params[:controller] == 'forums'
add_sidebar_menu ["Resources", "pencil"], "literature-nav", [[literatures_path(@venue), "List resources"], [new_literature_path(@venue), "Create a resources"]], false unless params[:controller] == 'literatures'
add_sidebar_menu ["Partners", "user"], "partner-nav", [[partners_path(@venue), "List partner"], [new_partner_path(@venue), "Create a partner"]], false unless params[:controller] == 'partners'
add_sidebar_menu ["Sponsors", "user"], "sponsors-nav", [[sponsors_path(@venue), "List sponsors"], [new_sponsor_path(@venue), "Create a sponsor"]], false unless params[:controller] == 'sponsors'
add_sidebar_menu ["Presentations", "beer"], "presentation-nav", [[presentations_path(@venue), "List presentations"], [new_presentation_path(@venue), "Create a presentation"]], false unless params[:controller] == 'presentations'
add_sidebar_menu ["Products", "gift"], "product-nav", [[products_path(@venue), "List products"], [new_product_path(@venue), "Create a product"]], false unless params[:controller] == 'products'
add_sidebar_menu ["Videos", "video-camera"], "video-nav", [[videos_path, "List videos"], [new_video_path, "Create a video"]], false unless params[:controller] == 'videos'
add_sidebar_menu ["Templates", "folder"], "templates-nav", [[templates_path(@venue), "List templates"], [new_template_path(@venue), "Create a template"]], false unless params[:controller] == 'templates'
elsif current_user.has_role? :booth_rep
add_sidebar_menu ["Resources", "pencil"], "literature-nav", [[literatures_path(@venue), "List resources"], [new_literature_path(@venue), "Create a resources"]], false unless params[:controller] == 'literatures'
add_sidebar_menu ["Partners", "user"], "partner-nav", [[partners_path(@venue), "List partner"], [new_partner_path(@venue), "Create a partner"]], false unless params[:controller] == 'partners'
add_sidebar_menu ["Sponsors", "user"], "sponsors-nav", [[sponsors_path(@venue), "List sponsors"], [new_sponsor_path(@venue), "Create a sponsor"]], false unless params[:controller] == 'sponsors'
add_sidebar_menu ["Presentations", "beer"], "presentation-nav", [[presentations_path(@venue), "List presentations"], [new_presentation_path(@venue), "Create a presentation"]], false unless params[:controller] == 'presentations'
add_sidebar_menu ["Products", "gift"], "product-nav", [[products_path(@venue), "List products"], [new_product_path(@venue), "Create a product"]], false unless params[:controller] == 'products'
add_sidebar_menu ["Videos", "video-camera"], "video-nav", [[videos_path, "List videos"], [new_video_path, "Create a video"]], false unless params[:controller] == 'videos'
elsif current_user.has_role? :host
add_sidebar_menu ["Resources", "pencil"], "literature-nav", [[literatures_path(@venue), "List resources"], [new_literature_path(@venue), "Create a resources"]], false unless params[:controller] == 'literatures'
add_sidebar_menu ["Partners", "user"], "partner-nav", [[partners_path(@venue), "List partner"], [new_partner_path(@venue), "Create a partner"]], false unless params[:controller] == 'partners'
add_sidebar_menu ["Sponsors", "user"], "sponsors-nav", [[sponsors_path(@venue), "List sponsors"], [new_sponsor_path(@venue), "Create a sponsor"]], false unless params[:controller] == 'sponsors'
add_sidebar_menu ["Presentations", "beer"], "presentation-nav", [[presentations_path(@venue), "List presentations"], [new_presentation_path(@venue), "Create a presentation"]], false unless params[:controller] == 'presentations'
add_sidebar_menu ["Products", "gift"], "product-nav", [[products_path(@venue), "List products"], [new_product_path(@venue), "Create a product"]], false unless params[:controller] == 'products'
add_sidebar_menu ["Videos", "video-camera"], "video-nav", [[videos_path, "List videos"], [new_video_path, "Create a video"]], false unless params[:controller] == 'videos'
add_sidebar_menu ["Webcasts - settings", "play-circle-o"], "webcast-nav2", [[hall_webcasts_path(@hall), "List webcasts"], [new_hall_webcast_path(@hall), "Create a webcast"]], false unless params[:controller] == 'webcasts'
elsif current_user.has_role? :visitor
add_sidebar_menu ["Users", "users"], "user-nav", [users_path, "List users"], false unless params[:controller] == 'users'
end
end
我在考虑使用meta programming
send
方法或eval
方法,但接下来我将如何查看这些对象,因为我仍然需要检查present?
条件,看看是否协会甚至存在
答案 0 :(得分:0)
哇。这是很多代码。除非我弄错了,否则在第二部分中会有Resources
到Videos
的重复。您可以将该部分隔离到ie。 default_menus
方法。
在第一部分中,有可能减少重复。您可以消除左/中/右区域和资源之间的区别,而是使用数组。然后你会得到类似的东西:
def set_area_vars
@resources = (0..4).map do |i|
webcast_area_convert_resources(hstore_string_to_hash(@webcast.areas[i])) if @webcast.areas[i].present?
end
end
这假设您已将左/中/右区域重新分配给名为@webcast.areas
的数组,并且@resources
现在也是一个数组(基于零的索引)。由你决定是否值得重构工作。
答案 1 :(得分:0)
正如您所建议的那样,在技术上可以将红宝石元编程哄骗给您几乎任何东西,但是在重构之后您的代码仍然可以保持可读性。正如@zwippie所说,如果您可以将实例变量转换为数组,这将更容易做到,但这很可能也会涉及更改您的视图。
根据@zwippie的建议,你的代码的第一部分将很容易重构,第二部分应该以不同的方式重构。我建议有一个包含所有sidebar_menu条目的数组(例如,如果你不想一直评估它们的lambdas)和某种级别(或决定菜单条目是否应显示给某个角色的方法) 。然后你可以编写一个循环来操作菜单条目和角色,并返回一个适合角色的sidebar_menu。