سؤال

أنا أستخدم جوهرة ودية. لدي أيضًا طريقي المتداخل:

# 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?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top