Как вызвать методы controller / view из консоли в Rails?
когда я загружаю script/console, несколько раз я хочу играть с выходом контроллера или вспомогательным методом представления.
есть варианты:
- сымитировать запрос?
- методы вызова из экземпляра контроллера по указанному запросу?
- тест вспомогательные методы, либо через указанный экземпляр контроллера или другим способом?
13 ответов:
простой способ вызвать действие контроллера из сценария / консоли и просмотреть / манипулировать объектом ответа:
> 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объект приложения является экземпляром ActionController::Integration:: Session
это работает для меня с помощью Rails 2.1 и 2.3, я не пробовал более ранние версии.
Если вам нужно проверить из консоли (проверено на Rails 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
вот один из способов сделать это через консоль:
>> 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смешивает свои методы в ваш объект, позволяя вам просматривать их возвращаемые значения.
другой способ сделать это-использовать отладчик rails. Есть руководство Rails об отладке в http://guides.rubyonrails.org/debugging_rails_applications.html
в принципе, запустите сервер с опцией-u:
./script/server -uа затем вставьте точку останова в свой скрипт, где вы хотели бы иметь доступ к контроллерам/помощникам/и т. д..
class EventsController < ApplicationController def index debugger end endи когда вы делаете запрос и нажимаете эту часть в коде, консоль сервера вернет подсказку, где вы можете делать запросы, просматривать объекты и т. д.. из командной строки. Когда закончите, просто введите "cont", чтобы продолжить выполнение. Есть также варианты расширенной отладки, но это должно по крайней мере начать работу.
если метод
POSTметодapp.post 'controller/action?parameter1=value1¶meter2=value2'[ здесь параметры будут согласно вашей применимости]
еще, если это
GETметодapp.get 'controller/action'
вы можете получить доступ к своим методам в консоли Rails, как показано ниже
controller.method_name helper.method_name
вот как сделать аутентифицированный запрос POST, используя Refinery в качестве примера:
# 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
в rails 3, Попробуйте это:
session = ActionDispatch::Integration::Session.new(Rails.application) session.get(url) body = session.response.bodyтело будет содержать HTML-код URL-адрес.
как маршрутизировать и визуализировать (отправлять) из модели в Rails 3
более ранние ответы вызывают помощников, но следующие помогут для вызова методов контроллера. Я использовал это на рельсах 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затем в консоли rails вы можете ввести что-то вроде...
request(:controller => :show, :action => :show_frontpage)...и html будет сброшен на консоль.
один возможный подход для тестирования вспомогательного метода в консоли rails-это
Struct.new(:t).extend(YourHelper).your_method(*arg)и для перезагрузки и
reload!; Struct.new(:t).extend(YourHelper).your_method(*arg)
внутри любого действия контроллера или представления, вы можете вызвать консоль, вызвав консоль метод.
например, в контроллере:
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
если вы добавили свой собственный помощник, и вы хотите, чтобы его методы были доступны в консоли do:
- в консоли Выполнить
include YourHelperName- ваши вспомогательные методы теперь доступны в консоли, используйте их вызов
method_name(args)в консоли.пример: скажем, у вас есть MyHelper (с помощью метода
my_method) в ' app / helpers / my_helper.rb`, то в консоли делаем:
include MyHelpermy_helper.my_method
Comments