如何在Rails中删除重复的函数调用

时间:2014-03-01 01:33:20

标签: ruby-on-rails ruby

有没有一种方法可以删除一组函数调用,如下所示?

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?条件,看看是否协会甚至存在

2 个答案:

答案 0 :(得分:0)

哇。这是很多代码。除非我弄错了,否则在第二部分中会有ResourcesVideos的重复。您可以将该部分隔离到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。