Ruby on Rails'teki konsoldan denetleyici / görünüm yardımcı yöntemlerini nasıl çağırabilirim?


442

Yüklediğimde script/console, bazen bir denetleyicinin veya bir görünüm yardımcı yönteminin çıktısıyla oynamak istiyorum.

Bunun için yollar var mı?

  • bir istek simüle?
  • talep üzerine bir kontrolör örneğinden çağrı yöntemleri?
  • söz konusu denetleyici örneği aracılığıyla veya başka bir yolla test yardımcı yöntemleri?

Yanıtlar:


479

Yardımcıları aramak için helpernesneyi kullanın :

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

Varsayılan olarak dahil edilmeyen bir yardımcı kullanmak istiyorsanız (diyelim ki, kaldırdığınız helper :alliçin ApplicationController), yardımcıyı eklemeniz yeterlidir.

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

Denetleyicilerle uğraşmaya gelince , Nick'in cevabını teklif ediyorum :

> 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
Birden fazla app.get(bir iş parçacığı hatası oluşur) çalıştıramazsınız gözlemlemek . Sistemi yıkamanın ve daha fazla kazanç elde etmenin bir yolu var mı?
JellicleCat

2
Rails 3.2 de bu çalışmaz. url_forKonsoldan aramam gerekiyordu . Bunu yapmak için yaptımapp.url_for(...)
Raphael

1
İçin NoMethodError: undefined method `protect_against_forgery?' for nil:NilClassadlı bir işlev tanımlamak protect_against_forgery?konsolu içinde olduğunu döndürürfalse
Sida Zhou

oturum açmış olan kullanıcıyı nasıl ayarlarım?

1
@RudolfOlah Görünüşe göre cihaz (veya bekçi) kullanıyorsanız bunu yapabilirsiniz ActionDispatch::Integration::Session.include(Warden::Test::Helpers); Warden.test_mode! ; app.login_as(User.find(1), scope: :user).
eloyesp

148

Bir komut dosyasından / konsoldan bir denetleyici eylemini çağırmanın ve yanıt nesnesini görüntülemenin / değiştirmenin kolay bir yolu:

> 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.

Uygulama nesnesi ActionController :: Integration :: Session örneğidir

Bu Ruby on Rails 2.1 ve 2.3 kullanarak benim için çalışıyor ve daha önceki sürümleri denemedim.


2
Uygulama nesnesiyle ilgili resmi belgelere bağlantı iyi olacaktır.
RajaRaviVarma

ActionController :: Integration :: Session sınıfının bir örneğidir. Cevabı da ekleyecek şekilde güncelledim.
Nick

İyi fikir. Bunu düşünmemiştim.
Marnen Laibow-Koser

5
Konsolun kimliğini nasıl doğrulayabilirim, böylece kimlik doğrulaması gerektiren denetleyicileri kontrol edebilirim?
Hafif Fuzz

7
Giriş sayfanıza şunu gönderebilmeniz gerekir: app.post '/ session / new', {: username => "foo",: password => "pass"}. Daha sonra sayfaları almak için aynı "uygulama" değişkenini kullanmaya devam edin.
Nick

108

Konsoldan test yapmanız gerekiyorsa (Ruby on Rails 3.1 ve 4.1 üzerinde test edilmiştir):

Çağrı Denetleyici Eylemleri:

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

ApplicationController yöntemleri:

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

Güzergah Yardımcıları:

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

Yardımcıları Görüntüle:

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\" />"

Render:

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 yöntemleri:

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

Lib modülleri:

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

1
Bu, raylar koşucusu kullanılarak çalıştırılacak bağımsız yakut komut dosyaları yazarken yardımcı olur ve uygulama denetleyicisinde yöntemleri çağırmaları gerekir. Teşekkürler
CodeExpress 15:30 '

@CodeExpress Bu asla olmamalı. Bunun yerine, yöntemleri bir hizmet nesnesine koyun ve hizmeti ApplicationController ve komut dosyanızdan çağırın.
Marnen Laibow-Koser

77

Konsoldan bunu yapmanın bir yolu:

>> 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>"

Yeni bir örneği oluşturmak ActionView::Base, yardımcınızın kullanacağı normal görüntüleme yöntemlerine erişmenizi sağlar. Daha sonra genişletme YourHelperModule, yöntemlerini nesnenize karıştırır ve dönüş değerlerini görüntülemenizi sağlar.


15

Yöntem yöntem ise POST:

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

(Burada parametreler uygulanabilirliğinize göre olacaktır.)

Başka bir GETyöntem ise o zaman:

app.get 'controller/action'

1
Ve istediğiniz yolları bulmak için app.methods.grep(/_path/):)
Dorian

Ve bu her zaman değil controler/action, rotalarınıza bağlıdır, örneğin olabilir /users/allve Api::UsersController#index:) için harita olabilir
Dorian

@Dorian Or rake routes. :)
Marnen Laibow-Koser

14

Bunu yapmanın başka bir yolu da Ruby on Rails hata ayıklayıcısını kullanmaktır. Hata ayıklama hakkında bir Ruby on Rails kılavuzu var http://guides.rubyonrails.org/debugging_rails_applications.html

Temel olarak, -u seçeneğiyle sunucuyu başlatın:

./script/server -u

Ardından, komut dosyasına denetleyicilere, yardımcılara vb. Erişmek istediğiniz bir kesme noktası ekleyin.

class EventsController < ApplicationController
  def index
    debugger
  end
end

Ve bir istekte bulunduğunuzda ve koddaki o bölüme geldiğinizde, sunucu konsolu bir komut isteminden istekte bulunabileceğiniz, nesneleri görüntüleyebileceğiniz vb. İşiniz bittiğinde, yürütmeye devam etmek için 'cont' yazın. Uzun hata ayıklama seçenekleri de vardır, ancak bu en azından başlamanıza yardımcı olacaktır.


3
> => Uyarı: Ruby 2.0'dan beri hata ayıklayıcı seçeneği yok sayılır ve gelecekteki sürümlerde kaldırılır.
parlak yıldız

13

Rafineri'yi örnek olarak kullanarak, kimliği doğrulanmış bir POST isteğinin nasıl yapılacağı aşağıda açıklanmıştır:

# 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}

Bir hata alırsanız bunları da yararlı bulabilirsiniz:

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

2
NameError: undefined local variable or method app for main:Object
Kamil Lelonek

ayrıca forgery_protection'ı devre dışı bırakmanız gerekirApplicationController.allow_forgery_protection = false
William Herry

Vay canına muhtemelen bu daha kolay. Yazdığım şey sahtecilikten korunma ile. Devre dışı bırakmanıza gerek yok, ama eminim daha uygun!
Chloe

12

Yöntemlerinize Ruby on Rails konsolunda aşağıdaki gibi erişebilirsiniz:

controller.method_name
helper.method_name


7

Önceki yanıtlar yardımcıları çağırmaktır, ancak aşağıdakiler denetleyici yöntemlerini çağırmak için yardımcı olacaktır. Bunu Ruby on Rails 2.3.2'de kullandım.

Öncelikle .irbrc dosyanıza aşağıdaki kodu ekleyin (ana dizininizde olabilir)

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

Sonra Ruby on Rails konsolunda şöyle bir şey yazabilirsiniz ...

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

... ve HTML konsola dökülecek.


3

Herhangi denetleyici eylem veya iç görünümü, sen arayarak konsolu çağırabileceği konsolu yöntemini .

Örneğin, bir denetleyicide:

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

Veya bir görünümde:

<% console %>

<h2>New Post</h2>

Bu, görünümünüzün içinde bir konsol oluşturur. Konsol çağrısının yerini önemsemenize gerek yoktur; çağrıldığı yerde değil, HTML içeriğinizin yanında görüntülenmez.

Bkz. Http://guides.rubyonrails.org/debugging_rails_applications.html


3

Denetleyiciler için, Ruby on Rails konsolunda bir denetleyici nesnesi başlatabilirsiniz.

Örneğin,

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

İşe yarıyor! Ancak eylem değişkenlerini nasıl güncelleyebilirim. Örnek: Değişkeni def show response = @user.contributions end nasıl geçersiz kılabilirim @user?
Fábio Araújo

2

Ruby on Rails konsolunda Yardımcı yöntem testi için olası bir yaklaşım:

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

Ve yeniden yükleme için şunları yapın:

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

1

Kendi yardımcısını eklediyseniz ve yöntemlerinin konsolda kullanılabilir olmasını istiyorsanız, şunları yapın:

  1. Konsolda yürüt include YourHelperName
  2. Yardımcı yöntemleriniz artık konsolda kullanılabilir ve bunları method_name(args)konsolda arayarak kullanabilirsiniz .

Örnek: my_method'app / helpers / my_helper.rb` içinde MyHelper (bir yöntemle ) olduğunu varsayalım, sonra konsolda şunları yapın:

  1. include MyHelper
  2. my_helper.my_method
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.