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>
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.
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 disebutpublic
ke kelas model, yang menggantikan yang ada diModule
visibilitas metode kontrol.