代码之家  ›  专栏  ›  技术社区  ›  lapinkoira

Rails中的大写变量范围

  •  0
  • lapinkoira  · 技术社区  · 8 年前

    例如,如果我使用这一行生成模型:

    bin/rails generate model Item Collection:references
    

    然后,它将使用大写参考变量生成这种迁移:

    class CreateItems < ActiveRecord::Migration
      def change
        create_table :items do |t|
          t.references :Collection, index: true
    
          t.timestamps
        end
      end
    end
    

    这将在表中生成一个大写的Collection_id字段。

    问题是,现在我想添加一个Scope,以从控制器中按Collection_id筛选Items:

    所以我在Item的模型中创建了这个范围 scope :collection_id, -> (Collection_id) { where collection_id: Collection_id }

    但当我在控制器中调用它时: @items=项目集合id(@user.collection_id)

    它会崩溃:

    形式参数不能是常量范围:collection_id,-> (集合_id){其中集合_id:集合_id}^

    我在范围中读到变量不能是大写变量,但由于迁移是以默认方式创建它们的,所以我不知道这是有意的还是我做错了。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Roman Kiselenko    8 年前

    将范围更改为:

    scope :collection_id, -> (collection_id) { where collection_id: collection_id }
    

    红宝石中以大写字母开头的所有变量都是常量。 我建议你修复它:

    第一次回滚迁移:

    bin/rake db:rollback
    

    销毁模型:

    bin/rails destroy model Item Collection:references
    

    使用普通字母大小写生成模型:

    bin/rails generate model Item collection:references
    

    就是这样。

    阅读此内容 Ruby Variables, Constants and Literals

        2
  •  1
  •   margo    8 年前

    为什么您在生成模型时将Collection资本化?Rails以某种方式为您提供大量服务。如果你藐视它的惯例,你将永远与铁轨抗争。

    我将回滚迁移并反转模型gneration。然后再次运行它,但不要将引用大写,一切都应该按预期运行。确保在回滚之前

    rails destroy model Item