[英]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.