16

का उपयोग करते समय ReadOnlyRecord मैंने हाल ही में एक परियोजना में ActiveAdmin का उपयोग शुरू किया और लगभग सबकुछ बढ़िया काम करता है लेकिन दोस्ताना_आईड मणि के संयोजन में इसका उपयोग करते समय मुझे समस्या हो रही है। मैं हो रही है ActiveRecord :: ReadOnlyRecord मेरी रूपों [मेरा मानना ​​है] friendly_id विशेषता जिसका आईडी की वजह के लिए फेंक दिया केवल पढ़ने के लिए है:ActiveRecord :: ActiveAdmin और Friendly_id

{"utf8"=>"✓", 
"_method"=>"put", 
"authenticity_token"=>"Rc5PmUYZt3BiLvfPQr8iCPPXlbfgjoe/n+NhCwXazNs=", 
"space"=>{"name"=>"The Kosmonaut", 
"address"=>"8 Sichovykh Striltsiv 24", 
"email"=>"[email protected]"}, 
"commit"=>"Update Space", 
"id"=>"the-kosmonaut"} <--- culprit 

मैं अंतिम पंक्ति अनुमान लगा रहा हूँ, क्योंकि यह एक केवल पढ़ने के लिए विशेषता है दोषी है यह मेरी रूप में नहीं बल्कि पथ में

http://localhost:5000/manage/spaces/the-kosmonaut/edit

मैं कैसे आईडी अपडेट करने का प्रयास से इसे ठीक कर सकते हैं?

ActiveAdmin में से फार्म इस तरह दिखता है:

form do |f| 
    f.inputs "Details" do 
     f.input :name 
     f.input :address 
     f.input :email 
     f.input :phone 
     f.input :website 
    end 
    f.inputs "Content" do 
     f.input :description 
     f.input :blurb 
    end 
    f.buttons 
    end 

अद्यतन: यह या तो काम नहीं करता है तो यह friendly_id नहीं है?

मैं का उपयोग कर @ वाटसन के सुझाव जो काम किया है चाहिए, लेकिन अब भी वही त्रुटि ;-(

{"utf8"=>"✓", 
"_method"=>"put", 
"authenticity_token"=>"Rc5PmUYZt3BiLvfPQr8iCPPXlbfgjoe/n+NhCwXazNs=", 
"space"=>{"name"=>"The Kosmonaut 23"}, 
"commit"=>"Update Space", 
"id"=>"6933"} 

http://localhost:5000/manage/spaces/6933/edit

मिला जब मैं record.readonly साथ कंसोल में रिकॉर्ड की जांच की कोशिश की? यह रिटर्न झूठी

अद्यतन अद्यतन: scope_to को हटाने से समस्या का समाधान

scope_to :current_user, :unless => proc{ current_user.admin? } 

केवल समस्या यह है कि उपयोगकर्ताओं को उन रिकॉर्ड को देखने से रोकने के लिए scope_to की आवश्यकता है, जिनके पास उनके स्वामित्व नहीं हैं। मेरा अनुमान है (जैसा कि मैं मान रहा हूं कि सामान्य रूप से है_मनी के साथ काम करता है) कि मेरा एचएबीटीएम एसोसिएशन कुछ अजीबता का कारण बनता है? आईई उपयोगकर्ता < - एचएबीटीएम -> रिक्त स्थान?

उत्तर

28

यदि आप केवल फ्रंट एंड में दोस्ताना आईडी चाहते हैं और सक्रिय व्यवस्थापक के अंदर उनके बारे में परवाह नहीं करते हैं, तो आप अपने सक्रिय व्यवस्थापक नियंत्रकों के लिए friendly_id मणि के प्रभावों को वापस कर सकते हैं।

मैं वास्तव में कैसे friendly_id ओवरराइड to_param विधि पता नहीं है, लेकिन अगर यह यह सामान्य तरीके से कर रहा है, यह आपके सक्रिय व्यवस्थापक नियंत्रकों के सभी के अंदर फिर से अधिभावी इसे ठीक करना चाहिए, जैसे:

ActiveAdmin.register Foobar do 
    before_filter do 
    Foobar.class_eval do 
     def to_param 
     id.to_s 
     end 
    end 
    end 
end 

इससे भी बेहतर आप आधार सक्रिय व्यवस्थापक नियंत्रक ActiveAdmin::ResourceController में पहले फ़िल्टर बना सकते हैं ताकि यह स्वचालित रूप से आपके सभी सक्रिय व्यवस्थापक नियंत्रकों में विरासत में हो।

पहले config/initializers/active_admin.rb सेटअप करने के लिए फ़िल्टर जोड़ें: THE ActiveAdmin::ResourceController खोल

ActiveAdmin.setup do |config| 
    # ... 
    config.before_filter :revert_friendly_id 
end 

और एक revert_friendly_id विधि जोड़ने, जैसे जोड़कर config/initializers/active_admin.rb के अंत में निम्नलिखित:

ActiveAdmin::ResourceController.class_eval do 
    protected 

    def revert_friendly_id 
    model_name = self.class.name.match(/::(.*)Controller$/)[1].singularize 

    # Will throw a NameError if the class does not exist 
    Module.const_get model_name 

    eval(model_name).class_eval do 
     def to_param 
     id.to_s 
     end 
    end 
    rescue NameError 
    end 
end 

अद्यतन: मैं सिर्फ कोई संबंधित मॉडल के साथ नियंत्रकों को संभालने के लिए पिछले कोड उदाहरण अद्यतन (जैसेसक्रिय व्यवस्थापक डैशबोर्ड नियंत्रक)

अद्यतन 2: मैं सिर्फ एक साथ ऊपर हैक का उपयोग कर friendly_id मणि के साथ की कोशिश की और यह ठीक :)

अद्यतन 3 काम करने के लिए लगता है: के कोड को साफ़ किया बेस नियंत्रक

+1

मैं अपने मान्यताओं में गलत हो सकता है, अपने समाधान काम किया जाना चाहिए था, लेकिन मैं अभी भी रिकॉर्ड संशोधित नहीं कर सकते। मैंने इसे प्रतिबिंबित करने के लिए प्रश्न बदल दिया। – holden

+0

Friendly_id एक लाल हेरिंग प्रतीत होता है। मेरे current_user scope_to के बिना यह friendly_id के साथ ठीक काम करता है ... ;-( – holden

+0

मैं दोस्ताना_आईडी और मेरे उपर्युक्त दृष्टिकोण का उपयोग करके रिकॉर्ड्स को ठीक से संशोधित कर सकता हूं। आपने इस सवाल को कुछ के साथ अपडेट किया है, जहां तक ​​मैं इसे समझता हूं, दोस्ताना_आईडी से संबंधित नहीं है समस्या है, लेकिन प्राधिकरण से संबंधित है। अगर आपको प्राधिकरण की आवश्यकता है तो मेरा सुझाव है कि आप कैनकन पर एक नज़र डालें। –

14

पर फ़िल्टर से पहले सक्रिय व्यवस्थापक जोड़ने का मानक तरीका उपयोग करें http://activeadmin.info/docs/2-resource-customization.html#customizing_resource_retrieval के अनुसार आप संसाधन पुनर्प्राप्ति को अनुकूलित कर सकते हैं। ध्यान दें कि आप resource के बजाय find_resource विधि का उपयोग करना चाहते हैं, या आप नए रिकॉर्ड बनाने में सक्षम नहीं होंगे।

(अधिक जानकारी के लिए https://github.com/gregbell/active_admin/blob/master/lib/active_admin/resource_controller/data_access.rb की जाँच करें)

अपने ActiveAdmin संसाधन वर्ग लिखने में:

controller do 
    def find_resource 
    scoped_collection.where(slug: params[:id]).first! 
    end 
end 

तुम भी active_admin.rb प्रारंभकर्ता में ResourceController modyfing द्वारा सभी संसाधनों के लिए व्यवहार के ऊपर लिख सकते हैं।

ActiveAdmin::ResourceController.class_eval do 
    def find_resource 
    if scoped_collection.is_a? FriendlyId 
     scoped_collection.where(slug: params[:id]).first! 
    else 
     scoped_collection.where(id: params[:id]).first! 
    end 
    end 
end 

आशा है कि मदद करता है!

साइड नोट: जब व्यवस्थापक इंटरफ़ेस के माध्यम से नए रिकॉर्ड बनाते हैं तो सुनिश्चित करें कि आप फॉर्म में स्लग फ़ील्ड शामिल नहीं करते हैं, या FriendlyId स्लग उत्पन्न नहीं करेगा। (मुझे विश्वास है कि केवल संस्करण के लिए है 5 +)

+1

यह सही उत्तर – jeffsaracco

+0

है मुझे नहीं लगता कि यह मेरे मॉडल में "स्कॉप्ड" स्लग का उपयोग करते हुए काम करेगा। अर्थात।स्लग केवल कुछ अन्य संपत्ति/एसोसिएशन के साथ संयोजन के दौरान अद्वितीय होने की गारंटी दी जाती है। इस स्थिति में कोई सुझाव? – elsurudo

+0

धन्यवाद बहुत डेनी, समस्या हल करने वाला! – Gibson

1

यहाँ @Thomas समाधान

ActiveAdmin.setup do |config| 
    # ... 
    config.before_filter :revert_friendly_id, :if => -> { !devise_controller? && resource_controller? } 
end 

# override #to_param method defined in model in order to make AA generate 
# routes like /admin/page/:id/edit 
ActiveAdmin::BaseController.class_eval do 

    protected 
    def resource_controller? 
    self.class.superclass.name == "ActiveAdmin::ResourceController" 
    end 

    def revert_friendly_id 
    model_name = self.class.name.match(/::(.*)Controller$/)[1].singularize 
    # Will throw a NameError if the class does not exist 
    Module.const_get model_name 

    eval(model_name).class_eval do 
     def to_param 
     id.to_s 
     end 
    end 
    rescue NameError 
    end 
end 
+0

यह मेरे लिए एक पंजीकृत_पृष्ठ है जब यह मेरे लिए काम करता है। उदाहरण के लिए: ActiveAdmin.register_page "डैशबोर्ड" धन्यवाद @ टिमूर आपने अपना दिन बचाया। – RoundOutTooSoon

+0

मैं आपको इस तकनीक से बचने की सलाह देता हूं, यह एक बहुप्रचारित वातावरण में असंगत परिणामों के साथ मॉडल वर्ग को संशोधित करेगा। –

3

इस विधि मेरे लिए काम करता के आधार पर मेरे समाधान है। अनुप्रयोग में इस कोड को जोड़ना/व्यवस्थापक/model_name.rb

ActiveAdmin.register model_name do 
    controller do 
    defaults finder: :find_by_slug 
    end 
end 
2

Denny's solution को जोड़ने के लिए, एक और अधिक 'दोस्ताना' समाधान friendly_id के ढूँढ़ने उपयोग करने के लिए किया जाएगा।

controller do 
    def find_resource 
    scoped_collection.friendly.find_by_friendly_id(params[:id]) 
    end 
end 

Source