【问题标题】:Uppercase variable scope in RailsRails 中的大写变量范围
【发布时间】:2016-04-16 08:37:48
【问题描述】:

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

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 字段。

问题是我现在想添加一个范围,通过控制器中的 Collection_id 过滤项目:

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

但是当我在控制器中调用它时: @items = Item.collection_id(@user.Collection_id)

它崩溃了:

形式参数不能是常量范围:collection_id,-> (Collection_id) { where collection_id: Collection_id } ^

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

【问题讨论】:

    标签: ruby-on-rails activerecord filtering


    【解决方案1】:

    将您的范围更改为:

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

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

    第一次回滚迁移:

    bin/rake db:rollback
    

    销毁模型:

    bin/rails destroy model Item Collection:references
    

    生成具有正常字母大小写的模型:

    bin/rails generate model Item collection:references
    

    就是这样。

    阅读此Ruby Variables, Constants and Literals

    【讨论】:

    • 最好在这个答案中添加一些关于使用 ruby​​ 常量作为范围参数的解释。
    【解决方案2】:

    为什么在生成模型时将 Collection 大写? Rails 以某种方式做事以提供大量服务供您使用。如果你无视它的惯例,你将永远与轨道作斗争。

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

    rails destroy model Item
    

    【讨论】:

    • 谢谢,这就是问题
    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多