2010-03-05 5 views
9

मैं एक बटन की कार्रवाई से एक जॉइन टेबल के भीतर एक रिकॉर्ड बनाने की कोशिश कर रहा हूं। मेरे पास एक इवेंट मॉडल होगा और प्रत्येक उपयोगकर्ता से चयनित घटनाओं को ट्रैक करना चाहते हैं।रेल - नियंत्रक से तालिका में शामिल होने के लिए रिकॉर्ड जोड़ें

मैंने एचएबीटीएम संबंध का उपयोग किया क्योंकि मुझे वास्तव में किसी भी अतिरिक्त फ़ील्ड की आवश्यकता नहीं है।

User.rb:

has_to_and_belongs_to_many :events 

Event.rb:

has_to_and_belongs_to_many :users 

Events_Users प्रवासन:

[user_id, event_id, id=>false] 

मैं रिकॉर्ड के वास्तविक निर्माण पर अटक कर रहा हूँ। किसी ने मुझे सांत्वना के भीतर में रिकॉर्ड जोड़ने के साथ पहले की मदद की:

u = User.find(1) 
u.events << Event.find(1) 

अब मैं एक लिंक पर क्लिक करने के परिणामस्वरूप कार्रवाई करने के लिए चाहते हैं ... इस सही दिशा में है?

def add 
    @user = User.find(session[:user_id]) 
    @event = Event.find(params[:id]) 
    if @user.events.save(params[:user][:event]) 
    flash[:notice] = 'Event was saved.' 
    end 
end 

मैं एक @user.events.new कहीं जोड़ना चाहिए और यदि ऐसा है तो मैं कहाँ है जो उपयोगकर्ता और जो घटना के पैरामीटर रख सकता हूं?

उत्तर

13

निम्नलिखित कोड काम करना चाहिए (यह मानते हुए कि आप नाम आईडी है कि एक घटना वस्तु की आईडी से मेल खाती है के साथ एक पैरामीटर में पारित):

def add 
    @user = User.find(session[:user_id]) 
    @event = Event.find(params[:id]) 
    @user.events << @event 
    flash[:notice] = 'Event was saved.' 
    end 

समस्याओं मैं अपने कोड में देख रहे हैं:

  1. आप एक हैश पास कर रहे हैं। सेव। सहेजें केवल एक बूलियन मान लेना चाहिए चाहे वैधता चलाना चाहिए और डिफ़ॉल्ट रूप से सत्य है। हालांकि .create और .n मूल्यों के हैश स्वीकार कर सकते हैं। (.save का उपयोग किया जाएगा। नया)।

  2. आप पैराम्स [: id] के माध्यम से एक ईवेंट लोड करते हैं लेकिन फिर आप पैराम्स [: उपयोगकर्ता] [: event] के माध्यम से एक ईवेंट बनाने का प्रयास करते हैं। आप कौन सा करना चाहते हैं? बनाएँ या लोड करें? (मेरा उदाहरण लोड मानता है)

  3. क्रियाएं जिनके प्रभाव पड़ते हैं, तब ऐसा होना चाहिए जब कोई उपयोगकर्ता बटन पर क्लिक करता है और 'लिंक पर क्लिक करने' के बजाय फ़ॉर्म सबमिट करता है। यह कोड क्रॉस साइट अनुरोध जालसाजी के लिए कमजोर हो सकता है (कोई व्यक्ति किसी अन्य साइट पर एक लिंक पर क्लिक करने के लिए चाल कर सकता है जो इस क्रिया को चलाता है)। यदि रेल सही रूप से कार्यान्वित किया गया है, तो इसके खिलाफ संरक्षित हैं क्योंकि वे अनुरोध फर्जी सुरक्षा टोकन का अनुरोध करते हैं।

  4. अधिकतर आप इस क्रिया के बाद उपयोगकर्ता को रीडायरेक्ट करना चाहते हैं। इस तरह की कार्रवाइयों को निष्पादित करने के बाद पृष्ठों को प्रस्तुत करना (रीडायरेक्ट करने के बजाए) खराब अभ्यास माना जाता है।

+0

आप मतलब है @ user.events << @ event.name ??? – ChrisWesAllen

+0

नहीं। अगर मैं समस्या का वर्णन सही तरीके से समझ रहा हूं तो वह कोड समझ में नहीं आता है। – Gdeglin

+0

सुझावों के लिए धन्यवाद, मैंने "<% = link_to image_tag (" grid_heart.gif ",: border => 0), नियंत्रक => 'ईवेंट',: action => 'add_event'%>" से "< % = button_to "जोड़ें",: नियंत्रक => 'ईवेंट',: action => "add"%> "लेकिन मुझे अभी भी एक" अनियंत्रित निरंतर EventController "होने में त्रुटि मिली है क्या मैंने विधि को गलत नियंत्रक में रखा था? – ChrisWesAllen

3

आपने कंसोल में क्या किया है जो आपको नियंत्रक में करने की आवश्यकता है।

def add 
    @user = User.find(session[:user_id]) 
    @event = Event.find(params[:id]) 
    @user.events << @event 
    flash[:notice] = 'Event was saved.' 
end 

यहां ध्यान देने योग्य बात यह है कि मौजूदा रिकॉर्ड के लिए < < ऑपरेटर का कारण होगा संघ तुरंत कायम किया जाना है।

अधिक जानकारी के लिए the ActiveRecord documentation पर एक नज़र डालें।

0

event_id के रूप में पैरामीटर पारित हो जाता है तो

User.find(session[:user_id]).events << Event.find(params[:id]) 
    flash[:notice] = 'Event was saved.' 

आप स्पष्ट की जरूरत नहीं है: [: id] और आप तो इस कॉल में केवल एक ही घटना को जोड़ रहे हैं, तो आप अपने नियंत्रक कोड में निम्न कर सकते हैं मौजूदा मॉडल उदाहरण के has_many एसोसिएशन को बचाने के लिए save

परिदृश्य 1

u = User.new(..) 
u.events << Event.first 
# Now you need to call `save` in order to save the user object 
# and the events association 
u.save 

परिदृश्य 2

u = User.first 
u.events << Event.first 
# Don't need to call `save` on `u` OR `u.events` 
+0

मुझे अभी भी अनियंत्रित निरंतर EventController कोई विचार कहां से आ सकता है? – ChrisWesAllen

+0

क्या आप पास्टी (http://pastie.org/) पर अपना कंट्रोलर कोड पोस्ट कर सकते हैं और एक लिंक प्रदान कर सकते हैं। –

+0

मैं कर सकता हूं, लेकिन यह एकमात्र तरीका है जिसे मैंने event_controller में जोड़ा है। जब मैं ऐड विधि को हटाता हूं तो कोई त्रुटि नहीं होती है, और शेष नियंत्रक को मचान से उत्पन्न किया गया था, इसलिए इसकी सुंदर मूलभूत सामग्री। \t \t @event = Event.find (पैरामीटर [: id]) \t \t @user: की तरह ... डीईएफ़ जोड़ने \t \t @user = User.find ([user_id] सत्र) वर्तमान पद्धति लग रहा है। घटनाओं << @event \t \t फ़्लैश [: नोटिस] = '। इवेंट बचा लिया गया था' \t अंत – ChrisWesAllen

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