簡體   English   中英

Ruby 和 Rails 升級后的“參數數量錯誤(給定 1,預期為 0)”

[英]'wrong number of arguments (given 1, expected 0)' following Ruby and Rails upgrade

我用 Ruby 2.4.0 和 Rails 5.1.2 構建了一個 Rails 應用程序,它運行良好。

然后我將 Ruby 升級到 2.5.5,將 Rails 升級到 5.2.3(因為 Heroku 要求升級),當我單擊特定鏈接時,出現以下錯誤:

ArgumentError (wrong number of arguments (given 1, expected 0)):

app/helpers/permissions_helper.rb:21:in `block in <module:PermissionsHelper>'
app/helpers/permissions_helper.rb:60:in `instance_eval'
app/helpers/permissions_helper.rb:60:in `block in permissions'
app/helpers/permissions_helper.rb:60:in `select'
app/helpers/permissions_helper.rb:60:in `permissions'
app/controllers/models_controller.rb:66:in `validate_user'

permission_helper.rb 如下(第 21 行和第 60 行有注釋):

    module PermissionsHelper

      PERMISSIONS = {
        User => [
          {
            requirement: ->{current_user.is_admin},
            actions: [:create, :read, :update, :destroy, :index, :update_all],
            rows: :all,
            cols: [:email, :username, :full_name]
          }
        ],
        ServiceGroup => [
          {
            requirement: ->{current_user.is_admin},  #line 21
            actions: [:create, :read, :update, :destroy, :index, :update_all],
            rows: :all_not_deleted,
            cols: [:service_group, :description]
          }
        ],
        ServiceType => [
          {
            requirement: ->{current_user.is_admin},
            actions: [:create, :read, :update, :destroy, :index, :update_all],
            rows: :all_not_deleted,
            cols: [:service_group_id, :service_type, :description]
          }
        ],
        Service => [
          {
            requirement: ->{current_user.is_admin},
            actions: [:create, :read, :update, :destroy, :index, :update_all],
            rows: :all_not_deleted,
            cols: [:service_type_id, :duration, :price, :format, :is_active]
          }
        ]
      }

      def action_type(action=action_name.to_sym)
        {
          show: :read,
          edit: :update
        }[action] || action
      end

      # Returns an array of permitted subtables {rows: ?, cols: [...]} for current request
      def permissions(model,action)
        return [] if !PERMISSIONS[model]
        @permissions ||= {}; @permissions[model] ||= {};
        action = action_type(action)
        return @permissions[model][action] if @permissions[model][action]
        mc = self
        @permissions[model][action] = PERMISSIONS[model].
          select {|h| mc.instance_eval(&h[:requirement]) && (h[:actions].include? action)}.  #line 60
          map {|h| {rows: h[:rows], cols: h[:cols]}}
      end

      # Returns all permitted rows for given model, action, e.g., User.where(:all_not_deleted)
      def permitted_rows(model,action)
        sets = permissions(model,action).map{|h| h[:rows]}.uniq
        sets.inject(model.send(sets.shift)) do |acc,set|
          acc.or(model.send(set))
        end
      end

      def fields(obj, action)
        if obj.is_a? ActiveRecord::Relation
          (relation = obj; model = relation.klass)
        else
          (model = obj; relation = nil)
        end
        @fields ||= {}; @fields[obj] ||= {}
        @fields[obj][action] ||= permissions(model, action).inject({}) do |acc, perm|
          new_fields = perm[:cols] - (acc[:cols] || [])
          new_rows = [perm[:rows]] - (acc[:rows] || [])
          if new_fields
            if new_rows.empty? || perm[:rows] == :all_not_deleted || relation.nil? ||
            relation.send(perm[:rows]).count > 0
              acc[:fields] = (acc[:fields] || []) + new_fields
              acc[:rows] = (acc[:rows] || []) + new_rows
            end
          end
          acc
        end [:fields]
      end
    end

ModelsController 的相關代碼片段如下:

    def validate_user
      @models = (params[:models] || [params[:model]]).map {|m| m.camelize.constantize}
      puts "permissions for #{@models[0]}:#{action_name} = #{permissions(@models[0], action_type)}". #line 66
      @models.each do |model|
        puts permissions(model, action_type)
        break (redirect_to root_url) unless permissions(model, action_type).any?
      end
    end

為什么我收到這個錯誤?

mc.instance_eval (在第 60 行)將self作為參數傳遞給塊。 由於您將 lambda ->{current_user.is_admin} (第 21 行)作為塊傳遞,因此該函數將接收 1 個參數。 但是您沒有為此 lambda 指定任何參數,因此出現錯誤: ArgumentError (wrong number of arguments (given 1, expected 0))

請閱讀 ruby​​ 中ProcLambda之間的差異(例如這篇文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM