سؤال

لدي نموذج القضبان Object هذا ليس لديه عمود معرف. بدلاً من ذلك ، يستخدم مجموعة من المفاتيح الأولية من نموذجين آخرين كمفتاح أساسي له ، dependency_id و user_id.

ما أريد القيام به هو أن أكون قادرًا على فعل شيء مثل هذا routes.rb:

map.resources :object, :primary_key => [:dependency_id, :user_id]

ولأنه لإنشاء عناوين URL بطريقة سحرية مثل هذا:

/objects/:dependency_id/:user_id
/objects/:dependency_id/:user_id/1
/objects/:dependency_id/:user_id/1/edit

... باستثناء أنني صنعت ذلك للتو ، وليس هناك بناء جملة.

هل هناك طريقة للتخصيص map.resources حتى أتمكن من الحصول على عناوين URL المريحة ، دون الحاجة إلى إنشاء طرق مخصصة لكل شيء؟ أم أنا فقط مشدود لعدم اتباع اتفاقية الهوية؟

ال :path_prefix يبدو الخيار واعداً إلى حد ما ، ومع ذلك ما زلت بحاجة إلى طريقة لإزالة id جزء من عنوان URL. وأود أن أظل قادرًا على استخدام مساعدي المسار إن أمكن.

هل كانت مفيدة؟

المحلول

يجب عليك تجاوز Object طريقة النموذج to_param لتعكس المفتاح الأساسي الخاص بك. شيء من هذا القبيل:

def to_param
  [dependency_id, user_id].join('-')
end

ثم عندما تقوم بتعيين عناوين URL لهذه الكائنات (مثل object_path(some_object)) سيتم تحويله تلقائيًا إلى شيء مثل /objects/5-3. ثم في العرض ، يجب عليك تقسيم params[:id] على اندفاعة وابحث عن كائن بواسطة REPENCED_ID و USER_ID:

def show
  dep_id, u_id = params[:id].split('-').collect(&:to_i)
  object = Object.find_by_dependency_id_and_user_id(dep_id, u_id)
end

يمكنك أيضا النظر إلى find_by_param جوهرة للقضبان.

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