首页 > 解决方案 > 模块定义的 Ruby on Rails 语法错误

问题描述

这是我使用 Ruby on Rails 构建的模式文件之一。当我尝试运行rails db:migraterails 应用程序时,出现语法错误,例如

SyntaxError: /home/../[file_name].rb:14: module definition in method body
      module SkipCallbacks
                          ^
bin/rails:4:in `<main>'
Tasks: TOP => db:migrate

我该如何处理这个问题?Rails 版本:5.2.3,红宝石版本:2.5.1

class SetInformation < ActiveRecord::Migration[5.2]

  def change
    Information.all.find_each do |info|
    place = info.places.first

      module SkipCallbacks
        def run_callbacks(kind, *args, &block)
          yield(*args) if block_given?
        end
      end

        if business.physical_address.present?
           ... ...
            dup_address.extend(SkipCallbacks)
           ... ...
        end

        ... ... ... ...
     end
  end
end

标签: ruby-on-railsruby

解决方案


在 ruby​​ 中,常规模块不能在方法内部定义。

你有两个选择:

  1. 将方法module SkipCallbacks移到change类级别:
class BackfillSomeInfoToLocations < ActiveRecord::Migration[5.2]
  module SkipCallbacks
    ...
  end

  def change
    ...
  end
end
  1. 不要移动,而是将其定义为匿名模块:
...
mod = Module.new do
  def run_callbacks(kind, *args, &block)
    yield(*args) if block_given?
  end
end
dup_physical_address.extend(mod)
...

推荐阅读