map.resources مع مفتاح (مفتاح) أساسي بديل
-
01-10-2019 - |
سؤال
لدي نموذج القضبان 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
جوهرة للقضبان.