Rails: Tidak dapat memiliki ruang lingkup yang disebut `publik` lagi dengan Rails 4.1?

Dibuat pada 9 Mei 2014  ·  3Komentar  ·  Sumber: rails/rails

Pada Rails 4.1, model berikut:

class Product < ActiveRecord::Base
  scope :public, where(true)
end

memberi saya kesalahan ini:

ArgumentError: You tried to define a scope named "public" on the model "Product", but Active Record already defined a class method with the same name.
    from /usr/local/stow/ruby-2.1.1-gh-2014.3.18/lib/ruby/gems/2.1.0/gems/activerecord-4.1.1/lib/active_record/scoping/named.rb:143:in `scope'
    from /tmp/scope/app/models/product.rb:2:in `<class:Product>'
    from /tmp/scope/app/models/product.rb:1:in `<top (required)>'

Tidak ada kesalahan pada Rails 4.0.5. Apakah ini perubahan yang disengaja untuk 4.1?

Saya melihat bahwa Module.public ada http://ruby-doc.org/core-2.1.1/Module.html#method -i-public

irb(main):001:0> Product.method(:public)
=> #<Method: Class(Module)#public>

Komentar yang paling membantu

Ya, ini adalah hal baru di Rails 4.1. Cakupan dengan nama "cadangan" ini selalu bermasalah dan menyebabkan banyak bug halus, jadi kami memutuskan untuk gagal.

Dalam hal ini, konfliknya adalah dengan metode Module.public seperti yang Anda sarankan. Dengan mendefinisikan ruang lingkup yang disebut public , itu akan menambahkan metode kelas yang disebut public ke kelas model, yang menggantikan yang ada di Module visibilitas metode kontrol.

Semua 3 komentar

Ya, itu disengaja. Lihat #14582 dan 7e8e91c terbaru untuk lebih jelasnya.

@gsamokovarov Terima kasih!

Ya, ini adalah hal baru di Rails 4.1. Cakupan dengan nama "cadangan" ini selalu bermasalah dan menyebabkan banyak bug halus, jadi kami memutuskan untuk gagal.

Dalam hal ini, konfliknya adalah dengan metode Module.public seperti yang Anda sarankan. Dengan mendefinisikan ruang lingkup yang disebut public , itu akan menambahkan metode kelas yang disebut public ke kelas model, yang menggantikan yang ada di Module visibilitas metode kontrol.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat