আমি কীভাবে নিয়ন্ত্রককে / কলগুলিতে কল করতে পারি রেল অন রেলের কনসোল থেকে?


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(একটি থ্রেড ত্রুটি ঘটে)। আমি সিস্টেমে ফ্লাশ করে আরও বেশি কিছু অর্জন করতে পারি তার কোন উপায় আছে কি?
জেলিকেলকিট

2
Ails.২ রেলগুলিতে নোট করুন এটি কার্যকর হয় না। আমার url_forকনসোল থেকে কল করা দরকার । এটি করার জন্য আমি করেছিapp.url_for(...)
রাফেল

1
জন্য NoMethodError: undefined method `protect_against_forgery?' for nil:NilClassএকটি ফাংশন বলা সংজ্ঞায়িত protect_against_forgery?কনসোল মধ্যে যে আয়false
সিডা ঝু

আমি বর্তমানে লগ ইন করা ব্যবহারকারীকে কীভাবে সেট করব?

1
@ রুডলফোলাহ মনে হচ্ছে আপনি যদি ডিভাইস (বা ওয়ার্ডেন) ব্যবহার করেন তবে আপনি এটিটি ব্যবহার করতে পারেন 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
অ্যাপ অবজেক্টে অফিসিয়াল ডকুমেন্টেশনের একটি লিঙ্ক ভাল হবে।
রাজারভির্মা

এটি অ্যাকশনকন্ট্রোলার :: ইন্টিগ্রেশন :: সেশন ক্লাসের একটি উদাহরণ। আমি অন্তর্ভুক্ত উত্তর আপডেট করেছি।
নিক

ভালো বুদ্ধি. আমি এই চিন্তা ছিল না।
মার্নেন লাইবো-কোসার

5
আমি কীভাবে কনসোলকে প্রমাণীকরণ করতে পারি, তাই আমি প্রমাণীকরণের প্রয়োজন হয় এমন কন্ট্রোলারগুলি পরীক্ষা করতে পারি?
হালকা Fuzz

7
আপনার লগ ইন পৃষ্ঠায় পোস্ট করতে সক্ষম হওয়া উচিত, যেমন: অ্যাপ.পস্ট '/ সেশন / নতুন', {: ব্যবহারকারীর নাম => "ফু",: পাসওয়ার্ড => "পাস"}} এবং তারপরে পৃষ্ঠাগুলি পেতে একই "অ্যাপ" ভেরিয়েবল ব্যবহার চালিয়ে যান।
নিক

108

আপনার যদি কনসোল থেকে পরীক্ষা করতে হয় (R.১ এবং ৪.১ রেলের উপর রুবিতে পরীক্ষা করা হয়েছে):

কল কন্ট্রোলার ক্রিয়াকলাপ:

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

অ্যাপ্লিকেশন নিয়ন্ত্রণকারী পদ্ধতি:

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'

অ্যাক্টিভসপোর্ট পদ্ধতি:

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

লিবি মডিউল:

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

1
এটি যখন আপনি স্বতন্ত্র রুবি স্ক্রিপ্টগুলি লিখছেন যা রেল রানার ব্যবহার করে চালানো হবে এবং অ্যাপ্লিকেশন নিয়ামকটিতে তাদের পদ্ধতিগুলি কল করতে হবে তখন এটি সহায়তা করে। ধন্যবাদ
কোডএক্সপ্রেস

@ কোডএক্সপ্রেস যা কখনই ঘটে না। পরিবর্তে, কোনও পরিষেবা অবজেক্টে পদ্ধতিগুলি রেখে দিন এবং অ্যাপ্লিকেশন নিয়ন্ত্রণকারী এবং আপনার স্ক্রিপ্ট উভয় থেকেই পরিষেবাটি কল করুন।
মার্নেন লাইবো-কোসার

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:)
ডোরিয়ান

@Dorian অথবা rake routes। :)
মার্নেন লাইবো-কোসার

14

এটি করার আরেকটি উপায় হ'ল রুবি অন রেলস ডিবাগারটি ব্যবহার করা। ডিবাগিংয়ের বিষয়ে একটি রুবি অন রেলে রয়েছেHttp://guides.rubyonrails.org/debugging_rails_applications.html

মূলত, -u বিকল্পটি দিয়ে সার্ভারটি শুরু করুন:

./script/server -u

এবং তারপরে আপনার স্ক্রিপ্টে একটি ব্রেকপয়েন্ট inোকান যেখানে আপনি নিয়ন্ত্রক, সহায়তাকারী ইত্যাদির অ্যাক্সেস পেতে চান where

class EventsController < ApplicationController
  def index
    debugger
  end
end

এবং যখন আপনি একটি অনুরোধ করবেন এবং কোডটির সেই অংশটি হিট করবেন, সার্ভার কনসোল একটি প্রম্পট ফিরিয়ে দেবে যেখানে আপনি কমান্ড প্রম্পট থেকে অনুরোধ করতে পারবেন, অবজেক্টগুলি দেখতে পারেন ইত্যাদি। শেষ হয়ে গেলে, সম্পাদনা চালিয়ে যেতে কেবল 'cont' টাইপ করুন। বর্ধিত ডিবাগিংয়ের জন্য বিকল্পগুলিও রয়েছে তবে এটি কমপক্ষে আপনাকে শুরু করা উচিত।


3
> => বিজ্ঞপ্তি: রুবি ২.০ থেকে ডিবাগার বিকল্পটি উপেক্ষা করা হবে এবং এটি ভবিষ্যতের সংস্করণগুলিতে সরানো হবে।
উজ্জ্বল-তারা

13

উদাহরণস্বরূপ রিফাইনারি ব্যবহার করে কীভাবে একটি অনুমোদনযোগ্য পোষ্ট অনুরোধ করবেন:

# 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
কামিল লেলোনেক

আপনার জালিয়াতি_প্রোটেকশনটিও অক্ষম করতে হবেApplicationController.allow_forgery_protection = false
উইলিয়াম হেরি

বাহ এটা সম্ভবত সহজ। আমি যা লিখেছি তা হ'ল জালিয়াতি সুরক্ষা। আপনার এটি অক্ষম করার দরকার নেই, তবে আমি নিশ্চিত এটি আরও সুবিধাজনক!
ক্লো

12

আপনি নীচের মতো রুবে অন রেল কনসোলে আপনার পদ্ধতিগুলি অ্যাক্সেস করতে পারেন:

controller.method_name
helper.method_name


7

পূর্ববর্তী উত্তরগুলি সাহায্যকারীদের কল করছে, তবে নিম্নলিখিতগুলি নিয়ন্ত্রণকারী পদ্ধতিগুলি কল করার জন্য সহায়তা করবে। আমি এটি রুবে অন রেলে ২.৩.২ এ ব্যবহার করেছি।

প্রথমে আপনার .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)

... এবং এইচটিএমএলটি কনসোলে ফেলে দেওয়া হবে।


3

যে কোনও নিয়ামক ক্রিয়া বা দেখার অভ্যন্তরে, আপনি কনসোল পদ্ধতিতে কল করে কনসোলটি শুরু করতে পারেন ।

উদাহরণস্বরূপ, একটি নিয়ামক মধ্যে:

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

বা একটি দৃষ্টিতে:

<% console %>

<h2>New Post</h2>

এটি আপনার দর্শনের অভ্যন্তরে একটি কনসোল রেন্ডার করবে। কনসোল কলটির অবস্থান সম্পর্কে আপনার প্রয়োজন নেই; এটির অনুরোধের জায়গায় কিন্তু আপনার এইচটিএমএল বিষয়বস্তুর পাশে রেন্ডার হবে না।

দেখুন: 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

এটি কাজ করে! তবে আমি কীভাবে অ্যাকশন ভেরিয়েবল আপডেট করতে পারি। প্রাক্তন: 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)

উদাহরণ: বলুন যে my_method'অ্যাপ / হেল্পার্স / মাই_হেল্পার.আরবি'তে আপনার মাইহেল্পার (একটি পদ্ধতি সহ ) রয়েছে, তারপরে কনসোলে করুন:

  1. include MyHelper
  2. my_helper.my_method
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.