على ريلز 4.1 ، النموذج التالي
class Product < ActiveRecord::Base
scope :public, where(true)
end
يعطيني هذا الخطأ:
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)>'
لا يوجد خطأ في الإصدار 4.0.5 من ريلز. هل هذا تغيير مقصود في الإصدار 4.1؟
أرى أن هذا Module.public موجود http://ruby-doc.org/core-2.1.1/Module.html#method -i-public
irb(main):001:0> Product.method(:public)
=> #<Method: Class(Module)#public>
نعم ، إنه متعمد. انظر # 14582 و 7e8e91c الأخير لمزيد من التفاصيل.
تضمين التغريدة
نعم ، هذا شيء جديد على ريلز 4.1. لطالما كانت هذه النطاقات ذات الأسماء "المحجوزة" إشكالية وسببًا للعديد من الأخطاء الدقيقة ، لذلك قررنا أن نفشل بصوت عالٍ بدلاً من ذلك.
في هذه الحالة ، يكون التعارض مع الطريقة Module.public كما اقترحت. من خلال تحديد نطاق يسمى public
، فإنه سيضيف طريقة فئة تسمى public
إلى فئة النموذج ، والتي تتجاوز تلك الموجودة في Module
طرق رؤية طرق التحكم.
التعليق الأكثر فائدة
نعم ، هذا شيء جديد على ريلز 4.1. لطالما كانت هذه النطاقات ذات الأسماء "المحجوزة" إشكالية وسببًا للعديد من الأخطاء الدقيقة ، لذلك قررنا أن نفشل بصوت عالٍ بدلاً من ذلك.
في هذه الحالة ، يكون التعارض مع الطريقة Module.public كما اقترحت. من خلال تحديد نطاق يسمى
public
، فإنه سيضيف طريقة فئة تسمىpublic
إلى فئة النموذج ، والتي تتجاوز تلك الموجودة فيModule
طرق رؤية طرق التحكم.