【问题标题】:Rails: Helper RefactoringRails:辅助重构
【发布时间】:2011-08-12 16:21:12
【问题描述】:

我有一个帮手,我觉得这很可笑,但我一直想不出改进它的方法。这是有问题的助手:

# 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,这个助手确定该按钮是否应该存在以及它的状态。

要显示管理菜单按钮,需要有登录用户,并且该用户需要是管理员,或者该用户需要查看允许他管理(编辑)的集合。

我的问题是:像这样的辅助方法是否正常 - 即您是否发现您不时需要这种复杂的方法 - 还是我遗漏了什么?您能提出改进此方法的方法吗?

【问题讨论】:

  • 我认为在与脚手架关联的特定帮助文件的帮助程序中包含此帮助程序方法是可以的。

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


【解决方案1】:

您可以为第一个条件创建一个方法,以便在其他地方重用它。

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

但是,是的,我想找到方法是很正常的,尤其是如果您只使用链接的条件。如果您将它用于代码的其他部分,最好有一个助手。

【讨论】:

  • 我认为这很有意义。出于某种原因,我通常很难将东西分解成多种方法,但通常会产生更清晰的代码。感谢您的建议!
【解决方案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

这种方法突出了两个可能的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

【讨论】:

  • 这真的很有趣,我喜欢它的工作原理,但我不禁注意到它实际上需要更多的代码行来构造这种方法......这绝对是好食物不过考虑一下,我从来没有想过这种方法。感谢分享!
  • @Andrew:“代码行数”与质量、清晰度、简单性或简洁性无关。
猜你喜欢
  • 2017-03-18
  • 2011-04-24
  • 2012-12-30
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
相关资源
最近更新 更多