一点背景:
我的应用程序tools
有permission_levels
. 有些User
's 对某些人有授权,而对其tools
他人则没有。管理面板是使用rails_admin gem构建的。
如果管理员正在编辑 aUser
并且User
有权访问tools
管理员没有的权限,则这些工具不会显示在编辑视图中(这是需要的)。但是,当管理员更新 时User
,User
会丢失与未显示的tools
关联permission_levels
。
为了解决这个问题,我覆盖了#edit
RailsAdmin 中的操作。生成的代码有点乱,我想通过将相关代码提取到方法中来进行重构,但是该部分被包装在Proc
.
如何将下面的代码提取到方法中?具体来说,register_instance_option :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
.
.
.