2011-12-30 16 views
6

मैं इस है:मैं ActiveAdmin के दृश्य में, नियंत्रक में परिभाषित आवृत्ति चर का उपयोग कैसे करूं?

ActiveAdmin.register User do 
    controller do 
    def show 
     @user = User.find(params[:id]) 
     show! 
    end 
    end 

    show do 
    attributes_table do 
     row "User" do 
     link_to @user.display_name, user_path(@user.slug) 
     end 
    end 
    end 
end 

लेकिन जब मैं पृष्ठ लोड, मैं कह रहा कोई त्रुटि मिलती है:

undefined method `display_name' for nil:NilClass 

जिसका अर्थ है कि @user नहीं के बराबर है। मैं सकारात्मक हूं कि @user उचित रूप से सेट किया गया है (जिसका अर्थ है कि खोजक को उचित डेटा मिल रहा है जो डीबी में मौजूद है)। मैं सोच रहा हूं कि इसमें एक्टिवएडमिन कैसे काम करता है, इस बारे में कुछ है कि मैं अपरिचित हूं। कोई विचार?

इसके अलावा, मुझे पता है कि मैं show do |user| कर सकता हूं, लेकिन इसमें अधिक जटिल चीजें हैं जिनका उपयोग मैं कर रहा हूं और नियंत्रक में उपयोगकर्ता ऑब्जेक्ट तक पहुंच की आवश्यकता है।

उत्तर

1

ऐसा लगता है कि सक्रियडमिन में ऐसा नहीं लगता है। "फॉर्म" ब्लॉक के अंदर उपलब्ध एकमात्र इंस्टेंस वैरिएबल @config है।

इस समस्या को हल करने के लिए सबसे अच्छा तरीका है "प्रपत्र अनुकूलित करना" में वर्णित के रूप आंशिक उपयोग करने के लिए है

http://activeadmin.info/docs/5-forms.html

+0

बहुत सारे प्रयोग के बाद, मैं सहमत हूं। हालांकि फॉर्म को कस्टमाइज़ करने के लिए आंशिक उपयोग करने के बारे में नहीं सोचा था। धन्यवाद! – jfedick

5

सक्रिय व्यवस्थापक में नियंत्रक नहीं है, इसके बावजूद आप हिस्सा Arbre के उदाहरण चर पारित नहीं हो सकता । लेकिन आप इस के लिए params हैश का उपयोग कर सकते हैं:

ActiveAdmin.register User do 
    controller do 
    def show 
     params[:user] = User.find(params[:id]) 
     show! 
    end 
    end 

    show do 
    attributes_table do 
     row "User" do 
     link_to params[:user].display_name, user_path(params[:user].slug) 
     end 
    end 
    end 
end 

पी.एस .: आप params बदलने के लिए नहीं करना चाहते हैं, तो सभी उदाहरण चर @arbre_context.assigns में संग्रहीत हैं।

link_to @arbre_context.assigns[:user].display_name, user_path(@arbre_context.assigns[:user].slug) 
21

शायद ज़रुरत पड़े कोई इस पर किसी और stumbles:

controller.instance_variable_get(:@user) 

रूप में अच्छी तरह से काम करना चाहिए तुम भी तरह कर सकते हैं।

+2

इसे सही उत्तर – MilesStanfield

+2

के रूप में चिह्नित किया जाना चाहिए मुझे नहीं पता था कि 'नियंत्रक' एए में एक बात थी। इसने मेरी सभी समस्याओं का समाधान किया है, धन्यवाद! –

+2

बिल्कुल सही, एक इलाज किया! मुझे एए इंडेक्स फ़ंक्शन में मेरा @ यूज़र वैरिएबल शून्य क्यों था, लेकिन इसका मतलब यह था कि अचानक मेरे पास आवश्यक मूल्य थे और पहले इंडेक्स फ़िल्टर में सेट किया गया था। जीवन सुरक्षित है! धन्यवाद –

0

पूरी तरह से सुनिश्चित नहीं है कि मॉडल पर सही इंस्टेंस चर का चयन कैसे किया जाता है, लेकिन, आप इंस्टेंस वैरिएबल को बहुत अधिक नाम दे सकते हैं, मैं कुछ मामलों का परीक्षण करता हूं और ऐसा लगता है कि केवल उसी मॉडल प्रकार को सहेजता है जब आप इसे निर्दिष्ट नहीं करते हैं, अपने अन्य सवाल का जवाब देने, आप इसे साधारण एक है, अपने उदाहरण चर, आपके मामले में के रूप में सिर्फ एक ही नाम करने के लिए कई तरीके होते हैं,

row :attr do 
    link_to user.display_name, admin_user_path(user) 
end  

आपके पास

row :attr do |any_name| 
    link_to any_name.display_name, admin_user_path(any_name) 
end 

और पिछले विधि मुझे पता है, तो आप दो escenarios, अपने active_admin फ़ाइलों के लिए एक (.rb)

#eg: admin/user.rb 
@arbre_context.assigns[:user] 

या कस्टम में है।एआरबी दृश्य, एक कस्टम collection_action के लिए एक रूप की तरह (एक ही लेकिन सीधी पहुँच)

assigns[:user] 

जैसे:

#views/admin/users/new_invitation.html.arb(arbre) or html.erb 
active_admin_form_for assigns[:user], :url => send_invitation_admin_users_path do |user| 
.... 
end 
form_for assigns[:user], :url => send_invitation_admin_users_path do |user| 
.... 
end 
semantic_form_for assigns[:user], :url => send_invitation_admin_users_path do |user| 
..... 

की तरह मुझे लगता है मैं यकीन नहीं है कहते हैं, कैसे active_admin उदाहरण चर के साथ सौदों, लेकिन एक कम से कम आप एक से अधिक विकल्प हैं, का संबंध

0

अपने लक्ष्य show कार्रवाई टेम्पलेट के लिए @user स्थापित करने के लिए है, तो उसे ऐसा करने के लिए आवश्यक नहीं है, क्योंकि सक्रिय व्यवस्थापक पहले से ही आप के लिए यह कर रही है।

यदि आप member_action का उपयोग करते हैं, तो @user ऑब्जेक्ट आपके लिए है, इसे resource कहा जाता है।

आप अपने resource पर सिंगलटन विधि को परिभाषित कर सकते हैं, यह दृश्य में उपलब्ध होगा। यह कुछ मामलों में समझ में आ सकता है।

नियंत्रक से जानकारी को पास करने का यह एक और तरीका है।

member_action :show, method: :get do 
    resource.instance_eval do 
     define_singleton_method('language') do 
      'English' 
     end 
    end 
end 

show do 
    attributes_table do 
     row :name 
     row :email 
     row :id 
     row :language 
    end 
end 
संबंधित मुद्दे