Ruby on rails 在rails\u管理自定义操作中重构Ruby进程内的代码
一点背景: 我的应用程序有Ruby on rails 在rails\u管理自定义操作中重构Ruby进程内的代码,ruby-on-rails,ruby,ruby-on-rails-4,rails-admin,ruby-2.1,Ruby On Rails,Ruby,Ruby On Rails 4,Rails Admin,Ruby 2.1,一点背景: 我的应用程序有工具,这些工具具有权限级别。有用户对某些工具有权限,而对其他工具没有权限。管理面板是使用 如果管理员正在编辑用户,并且用户可以访问工具,而管理员没有,则这些工具不会显示在编辑视图中(这是需要的)。但是,当管理员更新用户时,用户将丢失与未显示的工具和权限级别的关联 为了解决这个问题,我在RailsAdmin中重写了#edit操作。结果代码有点乱,我想通过将相关代码提取到方法中进行重构,但该部分被包装在Proc中 如何将下面的代码提取到方法中?具体来说,register\u
工具
,这些工具具有权限级别
。有用户
对某些工具
有权限,而对其他工具没有权限。管理面板是使用
如果管理员正在编辑用户
,并且用户
可以访问工具
,而管理员没有,则这些工具不会显示在编辑视图中(这是需要的)。但是,当管理员更新用户
时,用户
将丢失与未显示的工具
和权限级别
的关联
为了解决这个问题,我在RailsAdmin中重写了#edit
操作。结果代码有点乱,我想通过将相关代码提取到方法中进行重构,但该部分被包装在Proc
中
如何将下面的代码提取到方法中?具体来说,register\u instance\u选项:controller
部分
.
.
.
module Actions
class Edit < RailsAdmin::Config::Actions::Base
register_instance_option :member? do
true
end
register_instance_option :route_fragment do
'edit'
end
register_instance_option :http_methods do
[:get, :put]
end
register_instance_option :visible? do
authorized?
end
register_instance_option :controller do
Proc.new do
if @object.class.base_class.name == 'User'
if request.get?
session[:tools] = (@object.tools - Tool.admined_by(current_user)).map(&:id)
pl = session[:tools].map do |t|
tl = Tool.find(t)
tl.permission_levels
end
session[:permission_levels] = []
pl.flatten.each do |p|
session[:permission_levels] << p if @object.permission_levels.include?(p)
end
session[:permission_levels].map!(&:id)
elsif request.put?
duped_tools = session[:tools].dup
params[:user][:tool_ids] = duped_tools.
concat(params[:user][:tool_ids]).uniq!.delete_if { |id| id == "" }.
map { |id| id.to_i }
duped_permission_levels = session[:permission_levels].dup
params[:user][:permission_level_ids] = duped_permission_levels.
concat(params[:user][:permission_level_ids]).uniq!.delete_if { |id| id == "" }.
map { |id| id.to_i }
if @object.update_attributes(params.require(:user).permit!)
session[:tools] = nil
session[:permission_levels] = nil
duped_session = nil
flash[:success] = t("admin.flash.successful", :name => @model_config.label, :action => t("admin.actions.edit.done"))
redirect_to index_path
else
flash[:error] = t("admin.flash.error", :name => @model_config.label, :action => t("admin.actions.edit.done"))
redirect_path = back_or_index
end
end
end
end
end
register_instance_option :link_icon do
'icon-pencil'
end
end
end
.
.
.
。
.
.
模块动作
类编辑t(“admin.actions.edit.done”))
重定向到索引路径
其他的
flash[:error]=t(“admin.flash.error”,:name=>@model\u config.label,:action=>t(“admin.actions.edit.done”))
重定向路径=返回或索引
结束
结束
结束
结束
结束
注册\实例\选项:链接\图标do
“图标铅笔”
结束
结束
结束
.
.
.
以下是一些代码改进,以使用更少的行,并可能获得更好的性能:
少用线:
更好地使用Rails的方法:
我会把你的代码重构成这样:(请随意评论)
if@object.kind\u of?(用户)
如果请求,获取?
session[:tools]=@object.tools.where('id NOT IN(?),Tool.administrated_by(current_user)。pull(:id))#性能更好
会话[:工具]=会话[:工具]。包括(:权限级别)。平面地图(&:权限级别)
会话[:权限级别]=[]
会话[:工具]。每个do | p|
会话[:权限级别]
# All `register_instance_option` can be refactored in a one-line bock:
register_instance_option :member? do
true
end
# to
register_instance_option(:member?) { true }
if @object.class.base_class.name == 'User'
# can be changed to:
if @object.kind_of?(User) # will not work if @object is a Admin which inherits from User class
array_of_ids.delete_if { |id| id == "" }
# can be changed to:
array_of_ids.select(&:present?)
array = session[:tools].map do
# your logic
end
array = array.flatten
# can be changed to:
array = session[:tools].flat_map do
# your logic
end
# no need for a flatten (thanks to `.flat_map`)
session[:tools] = nil
session[:permission_levels] = nil
duped_session = nil
# can be changed to:
session[:tools] = session[:permission_levels] = duped_session = nil
if @object.kind_of?(User)
if request.get?
session[:tools] = @object.tools.where('id NOT IN (?)', Tool.admined_by(current_user).pluck(:id)) # better performances
session[:tools] = session[:tools].includes(:permission_levels).flat_map(&:permission_levels)
session[:permission_levels] = []
session[:tools].each do |p|
session[:permission_levels] << p.id if @object.permission_levels.include?(p)
end
elsif request.put?
duped_tools = session[:tools].dup
params[:user][:tool_ids] = duped_tools.concat(params[:user][:tool_ids]).uniq.select(&:present?).map(&:to_i)
duped_permission_levels = session[:permission_levels].dup
params[:user][:permission_level_ids] = duped_permission_levels.concat(params[:user][:permission_level_ids]).uniq.select(&:present?).map(&:to_i)
if @object.update_attributes(params.require(:user).permit!)
session[:tools] = session[:permission_levels] = nil
flash[:success] = t("admin.flash.successful", name: @model_config.label, name: t("admin.actions.edit.done"))
redirect_to index_path
else
flash[:error] = t("admin.flash.error", name: @model_config.label, action: t("admin.actions.edit.done"))
redirect_path = back_or_index
end
end
end