لماذا يجب عليك تحديد النطاق بشكل صريح مع Friendly_id؟
-
22-09-2019 - |
سؤال
أنا أستخدم جوهرة ودية. لدي أيضًا طريقي المتداخل:
# config/routes.rb
map.resources :users do |user|
user.resources :events
end
لذلك لدي عناوين URL /users/nfm/events/birthday-2009
.
في طرازاتي ، أريد أن يتم تحديد عنوان الحدث إلى اسم المستخدم ، بحيث يكون كلاهما nfm
و mrmagoo
يمكن أن يكون لها أحداث birthday-2009
دون أن يتم تبريرهم.
# app/models/event.rb
def Event < ActiveRecord::Base
has_friendly_id :title, :use_slug => true, :scope => :user
belongs_to :user
...
end
أنا أيضا أستخدم has_friendly_id :username
في نموذج المستخدم الخاص بي.
ومع ذلك ، في وحدة التحكم الخاصة بي ، أنا فقط أسحب الأحداث ذات الصلة بالمستخدم الذي تم تسجيل الدخول (Current_user):
def EventsController < ApplicationController
def show
@event = current_user.events.find(params[:id])
end
...
end
هذا لا يعمل. أحصل على الخطأ ActiveRecord::RecordNotFound; expected scope but got none
.
# This works
@event = current_user.events.find(params[:id], :scope => 'nfm')
# This doesn't work, even though User has_friendly_id, so current_user.to_param _should_ return "nfm"
@event = current_user.events.find(params[:id], :scope => current_user)
# But this does work!
@event = current_user.events.find(params[:id], :scope => current_user.to_param)
لذا, ، لماذا أحتاج إلى تحديد صراحة: SCOPE إذا كنت أقصرها على Current_user.events على أي حال؟ ولماذا يجب أن يتم استدعاء Current_user.to_param بشكل صريح؟ هل يمكنني تجاوز هذا؟
المحلول
واجهت نفس المشكلة بالضبط مع Friendly_id 2.2.7 ، لكن عندما قمت بتحديث Friendy_id 3.0.4 في تطبيق Rails 2.3.5 ، يعمل كل شيء. لقد قمت باختبار جميع الدعوات الأربعة التي ذكرتها في تطبيقي وهم يعملون.
شيء يجب علمنا به هو بعض التغييرات API التي قد تؤثر عليك. تلك التي واجهت هي:
:strip_diacritics
تم استبداله بـ:strip_non_ascii
.قررت التبديل إلى StringEx
String#to_url
بدلا من ذلك عن طريق تجاوزnormalize_friendly_id
resource.has_better_id?
هو الآن!resource.friendly_id_status.best?
resource.found_using_numeric_id?
هو الآنresource.friendly_id_status.numeric?