2011-08-25 15 views
5

मुझे पता है कि यह एक मामूली सवाल है। लेकिन मैंने पूरे Google पर खोज की है लेकिन इस प्रश्न का सरल जवाब नहीं मिल रहा है।रेल पर रूबी: एक स्ट्रिंग को मुद्रित करने के लिए और यह कहां प्रदर्शित होता है?

मूल रूप से मैं एक पंक्ति है कि ध्यान में रखते हुए <%= link_to 'Run it', :method => 'doIt' %> कहते हैं, तो इसी नियंत्रक में है, मैं doIt विधि इस प्रकार है:

def doIt 
    puts "Just do it" 
end 

मैं सिर्फ जांच करने के लिए कि अगर मैं रन यह पर क्लिक करें, यह स्ट्रिंग आउटपुट करेगा "बस इसे करें"। मैंने इसे लोकहोस्ट पर चलाया और इसमें कोई त्रुटि नहीं है, लेकिन मुझे आउटपुट "बस इसे" कहीं भी नहीं मिल रहा है। यह रेल कंसोल या रेल सर्वर लॉग में प्रदर्शित नहीं होता है। मैं सिर्फ यह जानना चाहता हूं कि स्ट्रिंग को आउटपुट कहां रखता है, इसे कहां मिलना है?


राउंड 2: तो यह है कि मैं क्या करने की कोशिश की है ....

जोड़ा गया index.html.erb में इस लाइन (जो जड़ है)

<%= link_to 'Run it', :method => 'do_it' %> 

और यूआरएल में, यह मूल रूप से http://localhost:3000/ है (चूंकि मैं रूट नियंत्रक # इंडेक्स रूट के रूप में)

डिस्प्ले सिर्फ एक रेखांकित है 'इसे चलाएं' जो 'do_it' से लिंक है नियंत्रक में विधि।

:

नियंत्रक में, मैं इस विधि

def do_it 
    logger.debug "Just do it" 
end 

जब मैं http://localhost:3000/gollum_starters?method=do_it के लिए url परिवर्तन 'यह भागो', पर और development.log में क्लिक करें, निम्न में लिखा है शामिल

Started GET "/gollum_starters?method=do_it" for 127.0.0.1 at 2011-08-25 15:27:49 -0700 
    Processing by GollumStartersController#index as HTML 
    Parameters: {"method"=>"do_it"} 
    [1m[35mGollumStarter Load (0.3ms)[0m SELECT "gollum_starters".* FROM "gollum_starters" 
Rendered gollum_starters/index.html.erb within layouts/application (3.6ms) 
Completed 200 OK in 16ms (Views: 7.7ms | ActiveRecord: 0.3ms) 

इसके अतिरिक्त, मैंने सभी लॉगर की कोशिश की। आतंक/जानकारी/घातक/आदि ... और Rails.logger.error/info/घातक/आदि, सभी ने विकास में "बस इसे करें" लाइन मुद्रित नहीं की लॉग

@ पॉल: मैंने पर्यावरण फ़ोल्डर या फ़ाइल को स्पर्श नहीं किया है, जब मैं एक नया रेल ऐप बनाया जाता है, तो यह डिफ़ॉल्ट रूप से मानता है, यह विकास में है?

@ मैज़: हाँ आप सही हैं, मैं सिर्फ परीक्षण करने की कोशिश कर रहा हूं कि do_it विधि कहां जा रही है या नहीं। ऐसा करने के लिए, मैं बस नियंत्रक में कुछ प्रिंट करना चाहता हूं। किसी भी तरह से सरल नहीं सोच सकता कि सिर्फ एक स्ट्रिंग को प्रिंट करें, लेकिन यह समस्या मुझे दुखी कर रही है। मैं सिर्फ टेक्स्टमैट का उपयोग कर रहा हूं, कोई आईडीई नहीं।


दौर 3:

@Paul THX बहुत है, लेकिन मैं त्रुटि

मेरे मार्गों फ़ाइलों का सामना करना पड़ा है:

resources :gollum_starters 

root :to => "gollum_starters#index" 

match 'gollum_starters/do_it' => 'gollum_starters#do_it', :as => 'do_it' 

मेरे index.html.erb अब है :

<%= link_to "Do it", do_it_path %> 

मेरा gollum_starters_controller।rb

def do_it 
    logger.debug 'Just do it' 
end 

मैं इस त्रुटि हो रही है:

Couldn't find GollumStarter with ID=do_it

त्रुटि यहाँ है, 2 पंक्ति:

def show 
    @gollum_starter = GollumStarter.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @gollum_starter } 
    end 
    end 

मुझे आश्चर्य है कि क्यों यह मार्ग दिखाने के लिए करता है? जब मैं do_it पर क्लिक करता हूं, तो यह वास्तव में लोकलहोस्ट पर जाता है: 3000/gollum_starters/do_it जो सही है, लेकिन स्पष्ट रूप से शो विधि को त्रुटि बिंदु इंगित करता है?


दौर 4:

@Paul, मैं संसाधनों स्थानांतरित कर दिया: gollum_starters नीचे:

root :to => "gollum_starters#index" 

match 'gollum_starters/do_it' => 'gollum_starters#do_it', :as => 'do_it' 

resources :gollum_starters 

लेकिन यह त्रुटि आई (OMG मैं अपने आप को मार करना चाहते हैं),

Template is missing

Missing template gollum_starters/do_it with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html], :locale=>[:en, :en]} in view paths "~/project_name/app/views"

:/

---------- दौर 4 का जवाब ------------

असल रूप में त्रुटि बताते हैं, वहाँ कोई टेम्पलेट है (यानी एक वेबपेज) इसलिए दिखाने के लिए त्रुटि फेंक दिया। समाधान एक redirect_to जोड़ने के लिए है, इस मामले में मैं root_url पर रीडायरेक्ट करता हूं।

def do_it 
    logger.debug 'Just do it' 
    redirect_to(root_url) 
end 

सबकुछ अब काम करता है, "बस इसे करें" अंततः विकास.लॉग और रेल सर्वर कंसोल पर आउटपुट करता है।

धन्यवाद मेरी मदद करने के लिए माज़ और पॉल और एंड्रयू धन्यवाद। बहुत कुछ सीखो।

http://guides.rubyonrails.org/debugging_rails_applications.html#sending-messages

इसका मतलब यह है कि भले ही आप rails s का उपयोग कर सर्वर शुरू नहीं करते उत्पादन अभी भी सही जगह पर जाना होगा:

+0

जॉन, नीचे वर्णित स्पष्टीकरण देखें। आप रेल में आरईएसटी का मुख्य विचार खो रहे हैं, और यदि आप इसे समझते हैं तो आप रेल के साथ ज्यादा खुश रहेंगे। शुभकामनाएँ :) – Andrew

+0

यूप इसे देखकर, विस्तृत स्पष्टीकरण –

उत्तर

4

link_to ऐसा नहीं करता है जो आपको लगता है कि यह :method के लिए मूल्य HTTP क्रियाओं का जिक्र कर रहा है।

के लिए ActionView::Helpers::UrlHelper

:method - Symbol of HTTP verb. Supported verbs are :post, :get, :delete and :put. By default it will be :post.

डॉक्स से लिया आप का उपयोग करता है अपने routes.rb फ़ाइल अपने विधि

# The order of routes is important as the first matched will be used 
# therefore the match needs to be above 'resources :controller' 
match 'controller/do_it' => 'controller#do_it', :as => 'do_it' 

resources :gollum_starters # <--- This needs to be below the match or this will catch first 
  • controller/do_it है मार्ग
  • मिलान किया जा करने के लिए एक मार्ग को परिभाषित करने की आवश्यकता होगी
  • controller#do_it नियंत्रक है जिसका उपयोग करने के लिए कार्रवाई की जाती है (से # द्वारा parated)
  • :as के लिए मूल्य पथ do_it_path कि में इस्तेमाल किया जा सकता बनाता है अपने link_to

आपका link_to लग सकता है की तरह

<%= link_to "Do it", do_it_path %> 

और एक अनुरोध के जीवन चक्र पूरा करने के लिए कुछ आप को

app/views/gollum_startes/do_it.html.erb # <-- Add file 
प्रस्तुत करने की आवश्यकता होगी 10

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

+0

हाय पॉल, यह समझ में आता है, लेकिन मुझे एक त्रुटि मिली, राउंड 3 –

+0

पर मेरी पोस्ट देखें अद्यतन उत्तर –

+0

आपको परेशान करने के लिए खेद है। एक और गायब टेम्पलेट त्रुटि मिली, दौर 4 देखें। –

-1

आप रेल प्रवेश करने तंत्र का उपयोग करना चाहते हैं।

+0

के लिए धन्यवाद, इसलिए मूल रूप से 'रखता है' रूबी विशिष्ट है। यह ror पर काम नहीं करता है भले ही मैं इसे एक .rb फ़ाइल में उपयोग करता हूं? –

+1

नहीं, एसटीडीओटीटी को आउटपुट भेजता है, ज्यादातर बार एसटीडीओयूटी टर्मिनल है, लेकिन कभी-कभी यह नहीं होता है। इस मामले में यह नहीं है। अभी भी काम करता है, यह सिर्फ उस सामग्री को आउटपुट नहीं करता है जहां आप इसे आउटपुट करना चाहते हैं। कंसोल में स्क्रॉल किए गए पाठ को विकास लॉग में भी लिखा गया है। यह लॉग इन है, टर्मिनल पर नहीं, जिसे आप लिखना चाहते हैं। स्पष्टीकरण के लिए – Maz

+0

Thx। मैंने इस लॉगजर की कोशिश की है। (डीबग | जानकारी | चेतावनी | त्रुटि | घातक) और इसके लिए विकास लॉग की जांच करें, लेकिन यह अभी भी लॉग को नहीं लिखता है। मैंने अपने प्रोजेक्ट फ़ोल्डर पर ctrl-shift-f भी किया है और नियंत्रक को छोड़कर इसे कहीं भी लॉग नहीं किया जा सकता है जहां मैंने logger.debug किया था "बस इसे करें"। इसलिए मूल रूप से मैं "इसे चलाएं" पर क्लिक करता हूं, और विधि do_it (रेलवे सम्मेलन का पालन करने के लिए इसे करने से बदल दिया जाता है) कहा जाता है, और मैंने logger.debug/info/etc किया ... लेकिन मैं विकास लॉग की जांच करता हूं और "बस इसे करें "इसे लिखा नहीं है। –

2

आप समझ नहीं रहे हैं कि एक लिंक के संदर्भ में "विधि" का क्या अर्थ है।

"विधि" यहां request method को संदर्भित करता है, जिसका अर्थ है कि आप किस प्रकार के अनुरोध को ब्राउज़र से पूछ रहे हैं। RESTful रेलवे जैसे अनुप्रयोग के परिप्रेक्ष्य से चार प्रासंगिक अनुरोध प्रकार हैं: प्राप्त करें, पोस्ट करें, पुट करें और हटाएं। ये अनुरोध प्रकार इस बात को प्रभावित करते हैं कि नियंत्रक अनुरोध का जवाब कैसे देता है।

  • प्राप्त => सूचकांक या
  • पोस्ट => बनाएं
  • PUT => अद्यतन
  • DELETE दिखाएँ => नष्ट कर

वहाँ दो अन्य "मानक" रेल कार्यों, नई हैं और संपादित करें। ये उपयोगकर्ता को एक इंटरफेस पेश करने के अनुरोध प्राप्त कर रहे हैं। नया आपको एक नई वस्तु पोस्ट (CREATE) के लिए एक फॉर्म देता है, और ईडीआईटी आपको पुट (अपडेट) और मौजूदा एक फॉर्म देता है।

the rails guide देखें कि कैसे HTTP Verbs CRUD संचालन से संबंधित है।

महत्वपूर्ण, बुनियादी बात यह समझने के लिए है कि डिफ़ॉल्ट रूप से लिंक, अनुरोध प्राप्त होते हैं, और फॉर्म, डिफ़ॉल्ट रूप से, POST अनुरोध हैं।

तो, जब आपके लिंक इस तरह दिखता है:

<%= link_to 'Run it', :method => 'do_it' %> 

... यह फर्जी है। "Do_it" जैसी कोई HTTP विधि नहीं है, इसलिए आप कुछ भी ट्रिगर नहीं कर रहे हैं। चूंकि ऐसी कोई विधि नहीं है, इसलिए रेल वास्तव में यूआरएल के पैरामीटर के रूप में इसे पास करते हैं।इसलिए यदि आप इसे क्लिक करते हैं तो आपको अपना यूआरएल बार देखना चाहिए, अब अंत में ?method=do_it कहता है।

आप जो करने की कोशिश कर रहे हैं उसके साथ कई समस्याएं हैं। सबसे पहले, the link_to helper कम से कम दो तर्कों की अपेक्षा करता है: 1, लिंक के लिए पाठ, और लिंक के लिए 2 एचआरईएफ। तो, आपको वास्तव में उपयोग करने की आवश्यकता है:

link_to 'Run it', url 

दूसरा, आपको यह पता होना चाहिए कि आपके नियंत्रक कार्रवाई को प्राप्त करने के लिए आपको कौन सा यूआरएल पास करना है।

कृपया निम्नलिखित रेल सम्मेलन से परिचित रहें: नियंत्रक कार्रवाई का जिक्र करते समय आप इसे फॉर्म का उपयोग करके संक्षिप्त कर सकते हैं: controller_name#controller_action। जैसे pages#show या articles#index

अपने नियंत्रक मान लिया जाये कि ExamplesController कहा जाता है, तो आप मैन्युअल इस प्रकार सात मानक नियंत्रक कार्यों को गति प्रदान कर सकते हैं:

link_to 'examples#index', '/examples' 
link_to 'examples#show', '/examples/123' # 123 is the id of a specific example 
link_to 'examples#new', '/examples/new' 
link_to 'examples#create', '/examples', :method => :post 
link_to 'examples#edit', '/examples/123/edit' 
link_to 'examples#update', '/examples/123', :method => :put 
link_to 'examples#destroy', '/examples/123', :method => :delete 

नोट से ऊपर, सूचकांक, शो, नई, और संपादित में सभी अनुरोध प्राप्त होते हैं। आप :method => :get निर्दिष्ट कर सकते हैं लेकिन यह अनावश्यक

इस सार को दूर करने के लिए और आवश्यक होने पर आईडी निर्दिष्ट करने का ख्याल रखने के लिए रेल path helpers प्रदान करता है।

तो, पथ सहायकों का उपयोग कर आप इस्तेमाल कर सकते हैं इसके बाद के संस्करण को दोहराने के लिए:

link_to 'examples#index', examples_path 
link_to 'examples#show', example_path(@example) 
link_to 'examples#new', new_example_path 
link_to 'examples#create', examples_path, :method => :post 
link_to 'examples#edit', edit_example_path(@example) 
link_to 'examples#update', example_path(@example), :method => :put 
link_to 'examples#destroy', example_path(@example), :method => :delete 

अब, आप रूटर से इन पथ सहायकों मिलता है, और वे अपने routes.rb फाइल में परिभाषित कर रहे हैं। उस फ़ाइल के भीतर यदि आप परिभाषित करते हैं:

resources :examples 

... तो आपको उपरोक्त सभी पथ_हेपर मिलेंगे।

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

आप वस्तुओं का पूरा संग्रह कार्य करना चाहते हैं, तो आप को परिभाषित:

resources :examples do 
    collection do 
    get 'do_it' 
    end 
end 

आप संग्रह का सिर्फ एक भी सदस्य पर कार्रवाई करने चाहते हैं तो आप को परिभाषित:

resources :examples do 
    member do 
    get 'do_it' 
    end 
end 

कहाँ मैंने ऊपर दिए गए उदाहरणों में 'प्राप्त' लिखा है, आप चार क्रियाओं में से किसी एक का उपयोग कर सकते हैं - जीईटी सामान्य रूप से होता है यदि आप एक पृष्ठ दिखाना चाहते हैं, और POST सामान्य रूप से मैं उपयोग करता हूं यदि आप एक फॉर्म सबमिट कर रहे हैं। तुम भी तो इस तरह आशुलिपि लिख सकते हैं:

resources :examples do 
    get 'do_it', :on => :collection 
    post 'something', :on => :member 
end 

कस्टम नियंत्रक निर्धारक क्रियाओं के बारे में अधिक के लिए, the rails guide देखते हैं।

अब जब आपने एक मार्ग परिभाषित किया है, तो आपको नए पथ सहायक का नाम देखने के लिए टर्मिनल में rake routes चलाया जाना चाहिए।आइए मान लीजिए कि आपने संग्रह विधि के रूप में do_it जोड़ा है, आपका पथ सहायक होगा: do_it_examples_path

तो अब, वापस अपने लिंक करने के लिए, यदि आप रख:

<%= link_to 'Do it.', do_it_examples_path %> 

... तो आप do_it कार्रवाई ट्रिगर करेगा। जब कार्रवाई आपके puts को सामान्य रूप से सर्वर लॉग में प्रस्तुत की जानी चाहिए (मान लीजिए कि आप टर्मिनल विंडो में रेल चल रहे हैं तो आपको इसे started GET on examples#do_it ... के ठीक बाद देखना चाहिए)।

अब ब्राउज़र में आपको एक अनुपलब्ध टेम्पलेट त्रुटि मिल जाएगी क्योंकि एक GET अनुरोध एक दृश्य प्रस्तुत करने की उम्मीद करने जा रहा है, लेकिन यह एक और प्रश्न के लिए एक विषय है। असल में, अब आपको समझना चाहिए कि नियंत्रक कार्य क्या हैं, आप उन्हें कैसे प्राप्त करते हैं। यदि आप अपने नियंत्रक कार्रवाई के साथ क्या करना है, see the guide :)

मुझे आशा है कि आप समझेंगे कि अब क्या हो रहा है। नि: संकोच प्रश्न पूछिए।

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