繁体   English   中英

我该如何干燥该方法?

[英]How can I dry this method?

  def restore_download_delete_file
    begin
      case params[:submit]
      when "restore"
        restore_status = restore_file(params[:file_names])
        raise if restore_status != 0
        flash[:notice] = "File Successfully Restored."
        redirect_to :action => "database_settings"
      when "download"
        download_status = download_file(params[:file_names])
        raise if download_status != 0
      when "delete"
        delete_status = delete_file(params[:file_names])
        raise if delete_status != 0
        flash[:notice] = "File Successfully Deleted."
        redirect_to :action => "database_settings"
      end
    rescue Exception => e
      flash[:error] = "Error with #{params[:submit]}! Please retry."
      redirect_to :action => "database_settings"
    end
  end

我该如何改善这种方法?

您可以通过将其分为四类来清理它:一种用于还原,一种用于删除,一种用于下载,以及一种用于调用适当的代码并处理异常。

def restore_download_delete_file
  begin
    self.send "#{params[:submit]}"
  rescue Exception => e
    flash[:error] = "Error with #{params[:submit]}! Please retry."
    redirect_to :action => "database_settings"
  end
end

def restore
  restore_status = restore_file(params[:file_names])
  raise if restore_status != 0
  flash[:notice] = "File Successfully Restored."
  redirect_to :action => "database_settings"
end

def download
  download_status = download_file(params[:file_names])
  raise if download_status != 0
end

def delete
  delete_status = delete_file(params[:file_names])
  raise if delete_status != 0
  flash[:notice] = "File Successfully Deleted."
  redirect_to :action => "database_settings"
end

另外,有几点注意事项:

  • 提出适当的例外,而不是零。
  • 不要挽救所有异常。 营救您正在抚养的人。

这样尝试

begin
  status = send("#{params[:submit]}_file", params[:file_names])
  raise unless status == 0
  if params[:submit] == 'restore' || params[:submit] == 'delete'
    flash[:notice] = "File Successfully #{params[:submit].capitalize}d"
  end
rescue Exception => e
  flash[:error] = "Error with #{params[:submit]}! Please retry."
ensure
  redirect_to :action => "database_settings" unless params[:submit] == 'download'
end
 def restore_download_delete_file
    submit = params[:submit]
    if not restore_file(params[:file_names]).zero?
      flash[:error] = "Error with #{submit}! Please retry."
    elsif submit != "download"
      flash[:notice] = "File Successfully #{submit.capitalize}d."
    else
      return
    end
    redirect_to :action => "database_settings"
 end

您总是可以将您的超级方法变成一个小解释器:

private
FILE_CMDS = {
    'delete' => {
        :action   => lambda { |names| delete_file(names) },
        :notice   => 'File Successfully Deleted.',
        :redirect => 'database_settings',
    },
    'download' => {
        :action => lambda { |names| download_file(names) },
    },
    'restore' => {
        :action   => lamba { |names| restore_file(names) },
        :notice   => 'File Successfully Restored.',
        :redirect => 'database_settings',
    },
}

public
def restore_download_delete_file
    begin
        cmd    = FILE_CMDS[params[:submit]]
        status = cmd[:action].call(params[:file_names])
        raise if(status != 0)
        flash[:notice] = cmd[:notice] if(cmd[:notice])
        redirect_to :action => cmd[:redirect] if(cmd[:redirect])
    rescue Exception => e
        flash[:error] = "Error with #{params[:submit]}! Please retry."
        redirect_to :action => "database_settings"
    end
end

但是我认为egarcia的方法最有意义。 确实不需要将所有这些东西混为一谈。 实际的共性实际上是很小的,因此,一个控制器中的四种方法更有意义:一种动作,一种方法。 DRY只是一个准则,不惜一切代价奉行教条。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM