Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在rails\u管理自定义操作中重构Ruby进程内的代码_Ruby On Rails_Ruby_Ruby On Rails 4_Rails Admin_Ruby 2.1 - Fatal编程技术网

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