6

का उपयोग करता है, मुझे अपने रेल ऐप में एक बहुत ही सरल (मुझे लगता है) एकल-टेबल विरासत (एसटीआई) सेटअप मिला है।रेल का फॉर्म_ जो एसटीआई बेस क्लास

एक नेस्टेड संसाधन पोस्ट के साथ एक उपयोगकर्ता मॉडल है। एसटीआई का उपयोग करके, मेरे पास यह है कि कुछ पोस्ट पोस्ट :: तत्काल वस्तुएं हो सकती हैं।

मैंने देखा है कि <%= [@user, @post] %> की तरह मेरी यूआरएल सहायकों <%= user_post_path[@user, @post] %> को हार्ड-कोडेड होने की जरूरत नहीं तो मैं के बारे में रेल user_post_urgent_path विधि नहीं मिल त्रुटि मिल रही पहुंचते हैं। ठीक है, यह काफी आसान था।

(ऐसा करने का एक वैकल्पिक तरीका भी <%= [@user, post: @post] %> है।)

ठीक है, अगर किसी कारण से मैं यह पता लगाने form_for विधि उसी तरह से समायोजित करने के लिए कैसे नहीं पा रहा हूँ। जब मैं बस

<%= form_for [@user, @post] do |f| %> 

लिखते हैं, मैं यूआरएल सहायक मामले के लिए इसी तरह त्रुटियों मिलता है, लेकिन रूप संदर्भ में: undefined method 'user_post_urgen_path'

मैं निर्दिष्ट करके इस तय:

<%= form_for [@user, @post], url: :user_post do |f| %> 

लेकिन यह पूरी तरह से काम नहीं करता है, क्योंकि जब मैं प्रपत्र प्रस्तुत करने के लिए जाना है, मैं अपने नियंत्रक में समस्याओं मिलता है, कह रही है कि मजबूत मापदंडों लाइन params.require(:post) विफल रहा:

param is missing or the value is empty: post 

अगर मैं params मुझे लगता है कि प्रपत्र एक post_urgent वस्तु और नहीं एक post वस्तु गुजर रहा है का निरीक्षण किया।

मैं निश्चित रूप से कुछ तर्क में डाल सकता हूं जो हमेशा if !params[:post] and params[:post_urgent], then params[:post] = params[:post_urgent] कहता है। लेकिन ऐसा लगता है कि रास्ता बहुत हैकी, खासकर रेल के लिए।

क्या पोस्ट मॉडल के उप-वर्ग के वास्तव में ऐसा होने के बावजूद इस "बस काम" जैसा कोई फ़ॉर्म बनाने का कोई बेहतर तरीका है?

उत्तर

10

सुनिश्चित नहीं हैं कि यदि आप एक समाधान पहले से ही पाया, लेकिन मैं अपने रूपों के लिए निम्नलिखित का उपयोग कर रहा

= form_for [@user, @post.becomes(Post)] do |f| 
    - f.object = @post.becomes @post.class 

संदर्भ: http://thepugautomatic.com/2012/08/rails-sti-and-form-for/

संबंधित मुद्दे