मैं रूबी ऑन रेल्स में कंसोल से कंट्रोलर / हेल्पर तरीकों को कैसे कह सकता हूं?


442

जब मैं लोड करता हूं script/console, तो कभी-कभी मैं एक नियंत्रक या एक दृश्य सहायक विधि के आउटपुट के साथ खेलना चाहता हूं।

क्या इसके तरीके हैं:

  • अनुरोध का अनुकरण करें?
  • कहा अनुरोध पर एक नियंत्रक उदाहरण से कॉल के तरीके?
  • परीक्षण सहायक विधियों, या तो नियंत्रक उदाहरण या किसी अन्य तरीके से कहा?

जवाबों:


479

सहायकों को कॉल करने के लिए, helperऑब्जेक्ट का उपयोग करें :

$ ./script/console
>> helper.number_to_currency('123.45')
=> "R$ 123,45"

यदि आप एक सहायक का उपयोग करना चाहते हैं जो डिफ़ॉल्ट रूप से शामिल नहीं है (कहते हैं, क्योंकि आपने हटा दिया helper :allहै ApplicationController), बस सहायक को शामिल करें।

>> include BogusHelper
>> helper.bogus
=> "bogus output"

नियंत्रकों से निपटने के लिए , मैं निक के उत्तर को उद्धृत करता हूं :

> app.get '/posts/1'
> response = app.response
# you now have a rails response object much like the integration tests

> response.body            # get you the HTML
> response.cookies         # hash of the cookies

# etc, etc

4
मैं देखता हूं कि मैं एक से अधिक कार्य नहीं कर सकता app.get(एक थ्रेड त्रुटि ensues)। क्या कोई तरीका है जिससे मैं सिस्टम को फ्लश कर सकता हूं और अधिक हो जाता है?
जेल्लेकैट

2
रेल 3.2 में नोट यह काम नहीं करता है। मुझे url_forकंसोल से कॉल करने की आवश्यकता थी । यह करने के लिए मैंने कियाapp.url_for(...)
राफेल

1
NoMethodError: undefined method `protect_against_forgery?' for nil:NilClassकिसी फ़ंक्शन protect_against_forgery?को कंसोल के भीतर बुलाया गया है, जिसे परिभाषित करने के लिएfalse
Sida Zhou

मैं वर्तमान में उपयोगकर्ता में लॉग इन कैसे सेट करूं?

1
@RudolfOlah ऐसा लगता है कि यदि आप डिवाइस (या वार्डन) का उपयोग कर रहे हैं तो आप इसके साथ कर सकते हैं ActionDispatch::Integration::Session.include(Warden::Test::Helpers); Warden.test_mode! ; app.login_as(User.find(1), scope: :user)
eloyesp

148

स्क्रिप्ट / कंसोल से कंट्रोलर एक्शन को कॉल करने और प्रतिक्रिया ऑब्जेक्ट को देखने / हेरफेर करने का एक आसान तरीका है:

> app.get '/posts/1'
> response = app.response
# You now have a Ruby on Rails response object much like the integration tests

> response.body            # Get you the HTML
> response.cookies         # Hash of the cookies

# etc., etc.

एप्लिकेशन ऑब्जेक्ट एक्शनकंट्रोलर :: एकीकरण :: सत्र का एक उदाहरण है

यह मेरे लिए रूबी 2.1 और 2.3 पर रूबी का उपयोग करने के लिए काम करता है, और मैंने पहले संस्करणों की कोशिश नहीं की।


2
एप्लिकेशन ऑब्जेक्ट पर आधिकारिक दस्तावेज का लिंक अच्छा होगा।
राजरविवर्मा

यह ActionController :: एकीकरण :: सत्र वर्ग का एक उदाहरण है। मैंने उसे शामिल करने के उत्तर को अपडेट कर दिया है।
निक

महान विचार। मैंने इस बारे में नहीं सोचा था।
मर्नेन लाईबो-कोसर

5
मैं कंसोल को कैसे प्रमाणित कर सकता हूं, इसलिए मैं उन नियंत्रकों की जांच कर सकता हूं जिन्हें प्रमाणीकरण की आवश्यकता है?
मिल्ड फज

7
आपको अपने लॉग इन पेज पर पोस्ट करने में सक्षम होना चाहिए, जैसे: app.post '/ session / new', {: username => "foo",: password => "pass"}। और फिर उसके बाद पृष्ठों को प्राप्त करने के लिए उसी "ऐप" चर का उपयोग करना जारी रखें।
निक

108

यदि आपको कंसोल से परीक्षण करने की आवश्यकता है (रूबी 3.1 और 4.1 पर रूबी पर परीक्षण किया गया):

कॉल कंट्रोलर एक्ट्स:

app.get '/'
   app.response
   app.response.headers  # => { "Content-Type"=>"text/html", ... }
   app.response.body     # => "<!DOCTYPE html>\n<html>\n\n<head>\n..."

ApplicationController तरीकों:

foo = ActionController::Base::ApplicationController.new
foo.public_methods(true||false).sort
foo.some_method

मार्ग सहायकों:

app.myresource_path     # => "/myresource"
app.myresource_url      # => "http://www.example.com/myresource"

सहायक देखें:

foo = ActionView::Base.new

foo.javascript_include_tag 'myscript' #=> "<script src=\"/javascripts/myscript.js\"></script>"

helper.link_to "foo", "bar" #=> "<a href=\"bar\">foo</a>"

ActionController::Base.helpers.image_tag('logo.png')  #=> "<img alt=\"Logo\" src=\"/images/logo.png\" />"

प्रस्तुत करना:

views = Rails::Application::Configuration.new(Rails.root).paths["app/views"]
views_helper = ActionView::Base.new views
views_helper.render 'myview/mytemplate'
views_helper.render file: 'myview/_mypartial', locals: {my_var: "display:block;"}
views_helper.assets_prefix  #=> '/assets'

ActiveSupport विधियाँ:

require 'active_support/all'
1.week.ago
=> 2013-08-31 10:07:26 -0300
a = {'a'=>123}
a.symbolize_keys
=> {:a=>123}

Lib मॉड्यूल:

> require 'my_utils'
 => true
> include MyUtils
 => Object
> MyUtils.say "hi"
evaluate: hi
 => true

1
यह मदद करता है जब आप स्वतंत्र रूबी स्क्रिप्ट लिख रहे हैं जो रेल रनर का उपयोग करके चलाया जाएगा और उन्हें आवेदन नियंत्रक में विधियों को कॉल करने की आवश्यकता है। धन्यवाद
CodeExpress

@CodeExpress ऐसा कभी नहीं होना चाहिए। इसके बजाय, विधियों को किसी सेवा ऑब्जेक्ट में रखें, और दोनों ApplicationController और आपकी स्क्रिप्ट से सेवा को कॉल करें।
मार्नेन लाईबो-कोसर

77

यहाँ कंसोल के माध्यम से ऐसा करने का एक तरीका है:

>> foo = ActionView::Base.new
=> #<ActionView::Base:0x2aaab0ac2af8 @assigns_added=nil, @assigns={}, @helpers=#<ActionView::Base::ProxyModule:0x2aaab0ac2a58>, @controller=nil, @view_paths=[]>

>> foo.extend YourHelperModule
=> #<ActionView::Base:0x2aaab0ac2af8 @assigns_added=nil, @assigns={}, @helpers=#<ActionView::Base::ProxyModule:0x2aaab0ac2a58>, @controller=nil, @view_paths=[]>

>> foo.your_helper_method(args)
=> "<html>created by your helper</html>"

एक नया उदाहरण बनाने से ActionView::Baseआपको सामान्य दृश्य विधियों तक पहुंचने में मदद मिलती है जो आपके सहायक संभावना का उपयोग करते हैं। फिर YourHelperModuleअपने तरीकों को अपनी वस्तु में मिला देता है जिससे आपको उनके रिटर्न मान देखने को मिलते हैं।


15

यदि विधि POSTविधि है तो:

app.post 'controller/action?parameter1=value1&parameter2=value2'

(यहां पैरामीटर आपकी प्रयोज्यता के अनुसार होंगे।)

और यदि यह GETविधि है तो:

app.get 'controller/action'

1
और आप चाहते हैं कि रास्ते खोजने के लिए, app.methods.grep(/_path/):)
डोरियन

और यह हमेशा नहीं होता है controler/action, आपके मार्गों पर निर्भर करता है, उदाहरण के लिए /users/allऔर Api::UsersController#index:
डोरियन

@ डोरियन या rake routes। :)
मार्नेन लाईबो-कोसर

14

ऐसा करने का एक और तरीका रूबी डीबगर पर रूबी का उपयोग करना है। पर डिबगिंग के बारे में पटरियों पर एक रूबी गाइड हैHttp://guides.rubyonrails.org/debugging_rails_applications.html

मूल रूप से, -u विकल्प के साथ सर्वर शुरू करें:

./script/server -u

और फिर अपनी स्क्रिप्ट में एक ब्रेकपॉइंट डालें जहां आप कंट्रोलर्स, हेल्पर्स आदि तक पहुंचना चाहेंगे।

class EventsController < ApplicationController
  def index
    debugger
  end
end

और जब आप एक अनुरोध करते हैं और कोड में उस हिस्से को हिट करते हैं, तो सर्वर कंसोल एक शीघ्र वापस आ जाएगा जहां आप कमांड प्रॉम्प्ट से अनुरोध, दृश्य वस्तुएं आदि बना सकते हैं। जब समाप्त हो जाए, तो निष्पादन जारी रखने के लिए सिर्फ 'कॉन' टाइप करें। विस्तारित डिबगिंग के लिए भी विकल्प हैं, लेकिन यह कम से कम आपको आरंभ करना चाहिए।


3
> => सूचना: रूबी 2.0 के बाद से डिबगर विकल्प को नजरअंदाज कर दिया गया है और इसे भविष्य के संस्करणों में हटा दिया जाएगा।
उज्ज्वल-स्टार

13

यहाँ एक उदाहरण के रूप में रिफाइनरी का उपयोग करके एक प्रामाणिक POST अनुरोध करने का तरीका बताया गया है:

# Start Rails console
rails console
# Get the login form
app.get '/community_members/sign_in'
# View the session
app.session.to_hash
# Copy the CSRF token "_csrf_token" and place it in the login request.
# Log in from the console to create a session
app.post '/community_members/login', {"authenticity_token"=>"gT7G17RNFaWUDLC6PJGapwHk/OEyYfI1V8yrlg0lHpM=",  "refinery_user[login]"=>'chloe', 'refinery_user[password]'=>'test'}
# View the session to verify CSRF token is the same
app.session.to_hash
# Copy the CSRF token "_csrf_token" and place it in the request. It's best to edit this in Notepad++
app.post '/refinery/blog/posts', {"authenticity_token"=>"gT7G17RNFaWUDLC6PJGapwHk/OEyYfI1V8yrlg0lHpM=", "switch_locale"=>"en", "post"=>{"title"=>"Test", "homepage"=>"0", "featured"=>"0", "magazine"=>"0", "refinery_category_ids"=>["1282"], "body"=>"Tests do a body good.", "custom_teaser"=>"", "draft"=>"0", "tag_list"=>"", "published_at(1i)"=>"2014", "published_at(2i)"=>"5", "published_at(3i)"=>"27", "published_at(4i)"=>"21", "published_at(5i)"=>"20", "custom_url"=>"", "source_url_title"=>"", "source_url"=>"", "user_id"=>"56", "browser_title"=>"", "meta_description"=>""}, "continue_editing"=>"false", "locale"=>:en}

यदि आपको कोई त्रुटि मिलती है, तो आप ये उपयोगी भी पा सकते हैं:

app.cookies.to_hash
app.flash.to_hash
app.response # long, raw, HTML

2
NameError: undefined local variable or method app for main:Object
कामिल लेलोनेक

आप भी अक्षम forgery_protection जरूरत हैApplicationController.allow_forgery_protection = false
विलियम Herry

वाह, यह शायद आसान है। मैंने जो लिखा है वह जालसाजी संरक्षण के साथ है। आपको इसे अक्षम करने की आवश्यकता नहीं है, लेकिन मुझे यकीन है कि यह अधिक सुविधाजनक है!
क्लो

12

आप रूबी कंसोल पर रूबी में अपने तरीकों को निम्न तरह से एक्सेस कर सकते हैं:

controller.method_name
helper.method_name


7

पहले के उत्तर हेल्पर्स को बुला रहे हैं, लेकिन निम्नलिखित नियंत्रक विधियों को कॉल करने में मदद करेगा। मैं रूबी 2.3.2 पटरियों पर रूबी पर इसका इस्तेमाल किया है।

सबसे पहले अपनी .irbrc फ़ाइल में निम्नलिखित कोड जोड़ें (जो आपके होम डायरेक्टरी में हो सकता है)

class Object
   def request(options = {})
     url=app.url_for(options)
     app.get(url)
     puts app.html_document.root.to_s
  end
end

फिर रूबी ऑन रेल्स कंसोल में आप कुछ इस तरह टाइप कर सकते हैं ...

request(:controller => :show, :action => :show_frontpage)

... और HTML को कंसोल पर डंप किया जाएगा।


3

किसी भी नियंत्रक क्रिया या दृश्य के अंदर, आप कंसोल विधि को कॉल करके कंसोल को लागू कर सकते हैं ।

उदाहरण के लिए, एक नियंत्रक में:

class PostsController < ApplicationController
  def new
    console
    @post = Post.new
  end
end

या एक दृश्य में:

<% console %>

<h2>New Post</h2>

यह आपके दृश्य के अंदर एक कंसोल प्रदान करेगा। आपको कंसोल कॉल के स्थान के बारे में परवाह करने की आवश्यकता नहीं है; यह इसके आह्वान के स्थान पर नहीं बल्कि आपके HTML सामग्री के बगल में प्रदान किया जाएगा।

देखें: http://guides.rubyonrails.org/debugging_rails_applications.html


3

नियंत्रकों के लिए, आप रूबी कंसोल पर रूबी में एक नियंत्रक ऑब्जेक्ट को तुरंत हटा सकते हैं।

उदाहरण के लिए,

class CustomPagesController < ApplicationController

  def index
    @customs = CustomPage.all
  end

  def get_number
    puts "Got the Number"
  end

  protected

  def get_private_number
    puts 'Got private Number'
  end

end

custom = CustomPagesController.new
2.1.5 :011 > custom = CustomPagesController.new
 => #<CustomPagesController:0xb594f77c @_action_has_layout=true, @_routes=nil, @_headers={"Content-Type"=>"text/html"}, @_status=200, @_request=nil, @_response=nil>
2.1.5 :014 > custom.get_number
Got the Number
 => nil

# For calling private or protected methods,
2.1.5 :048 > custom.send(:get_private_number)
Got private Number
 => nil

यह काम करता हैं! लेकिन मैं एक्शन चर कैसे अपडेट कर सकता हूं। Ex: def show response = @user.contributions end मैं @userचर को कैसे ओवरराइड करूं ?
फैबियो अरूजो

2

रूबी कंसोल पर रूबी में हेल्पर विधि परीक्षण के लिए एक संभावित दृष्टिकोण है:

Struct.new(:t).extend(YourHelper).your_method(*arg)

और फिर से लोड करने के लिए:

reload!; Struct.new(:t).extend(YourHelper).your_method(*arg)

1

यदि आपने अपना सहायक जोड़ा है और आप चाहते हैं कि इसके तरीके कंसोल में उपलब्ध हों, तो:

  1. कंसोल में निष्पादित करें include YourHelperName
  2. आपके सहायक तरीके अब कंसोल में उपलब्ध हैं, और उन्हें method_name(args)कंसोल में कॉलिंग का उपयोग करें ।

उदाहरण: कहते हैं कि आपके पास MyHelper (एक विधि के साथ my_method) 'ऐप / हेल्पर्स / my_helper.rb` है, तो कंसोल में करें:

  1. include MyHelper
  2. my_helper.my_method
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.