[英]'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 中Proc
和Lambda
之間的差異(例如這篇文章)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.