2011-08-23 11 views
6

पर सेट करने के बाद कॉलबैक के बाद मैं अपडेट_बी कॉलम को current_user पर सेट करने के लिए बाद में सहेजने के लिए कॉलबैक का उपयोग करना चाहता हूं। लेकिन मौजूदा_यूसर मॉडल में उपलब्ध नहीं है। मुझे यह कैसे करना चाहिए?अपडेट_बी कॉलम को current_user

उत्तर

8

आपको इसे नियंत्रक में संभालने की आवश्यकता है। पहले मॉडल पर सहेजें निष्पादित करें, फिर यदि रिकॉर्ड फ़ील्ड को सफलतापूर्वक अद्यतन करें।

उदाहरण

class MyController < ActionController::Base 
    def index 
    if record.save 
     record.update_attribute :updated_by, current_user.id 
    end 
    end 
end 

एक अन्य विकल्प (मैं इस एक पसंद करते हैं) कि तर्क लपेटता अपने मॉडल में एक कस्टम विधि बनाने के लिए है। उदाहरण

class Record < ActiveRecord::Base 
    def save_by(user) 
    self.updated_by = user.id 
    self.save 
    end 
end 

class MyController < ActionController::Base 
    def index 
    ... 
    record.save_by(current_user) 
    end 
end 
+0

+1 :) – lucapette

+0

कारण यह है कि यह शुष्क है, को बचाने के बाद से (है) ऐप में कई स्थानों से बुलाया जा सकता है, केवल एक नियंत्रक नहीं। मैं बस इसे एक बार करना चाहता हूं, और खुद को दोहराना नहीं है, और हमेशा इसे स्थापित करने के बारे में चिंता करने की चिंता करें। – pixelearth

+0

फिर मॉडल.save_from_user (उपयोगकर्ता) जैसी एक नई विधि बनाएं और रिकॉर्ड को सहेजने और स्पर्श करने के लिए तर्क रखें। फिर, अपने नियंत्रक में बस उस विधि को 'current_user' को तर्क के रूप में पास करने के लिए कॉल करें। –

1

के लिए मैं इस monkeypatch सिमोन Carletti की सलाह के आधार पर लागू किया है, जहाँ तक मैं touch केवल करता timestamps, नहीं उन आईडी बता सकते हैं। क्या इसमें कुछ गड़बड़ है? यह एक devise current_user के साथ काम करने के लिए डिज़ाइन किया गया है।

class ActiveRecord::Base 
    def save_with_user(user) 
    self.updated_by_user = user unless user.blank? 
    save 
    end 

    def update_attributes_with_user(attributes, user) 
    self.updated_by_user = user unless user.blank? 
    update_attributes(attributes) 
    end 
end 

और फिर create और update तरीकों तो जैसे इन फोन: मॉडल में डालने के लिए स्पर्श विधि के लिए

@foo.save_with_user(current_user) 
@foo.update_attributes_with_user(params[:foo], current_user) 
संबंधित मुद्दे