我在Ruby中导入文件时遇到了麻烦.我在Windows XP中制作一个Ruby应用程序.该应用程序的所有类文件都在"C:/Documents/Prgm/Surveyor_Ruby/lib".但是当我require在另一个文件中的文件时,ruby和irb都无法找到所需的文件.
当前目录的内容:
C:\Documents\Prgm\Surveyor_Ruby\lib>dir
Volume in drive C has no label.
Volume Serial Number is AAAA-BBBB
Directory of C:\Documents\Prgm\Surveyor_Ruby\lib
10/09/2010 06:32 PM <DIR> .
10/09/2010 06:32 PM <DIR> ..
10/08/2010 03:22 PM 5,462 main (commented).rb
10/08/2010 03:41 PM 92 question.rb
10/08/2010 09:06 PM 2,809 survey.rb
10/09/2010 06:25 PM 661 surveyor.rb
10/08/2010 01:39 PM 1,546 test.rb
5 File(s) 10,570 bytes
2 Dir(s) 40,255,045,632 bytes free
Run Code Online (Sandbox Code Playgroud)
确认irb在正确的目录中:
C:\Documents\Prgm\Surveyor_Ruby\lib>irb
irb(main):001:0> Dir.pwd
=> "C:/Documents/Prgm/Surveyor_Ruby/lib"
Run Code Online (Sandbox Code Playgroud)
...但是irb无法加载survey.rb:
irb(main):002:0> require 'survey'
LoadError: no …Run Code Online (Sandbox Code Playgroud) 关于Rails控制台的使用,当我对模型进行一些更改时,是否每次都需要重新加载rails控制台以使该更改反映出来?
例如,我的原始代码如下:
class Article < ActiveRecord::Base
validates :title, :presence => true
validates :body, :presence => true
end
Run Code Online (Sandbox Code Playgroud)
稍后,我想添加一些额外的属性,如下所示.
class Article < ActiveRecord::Base
validates :title, :presence => true
validates :body, :presence => true
def long_title
"#{title} - #{published_at}"
end
end
Run Code Online (Sandbox Code Playgroud)
是否需要运行命令"reload!" 每次都可以做"long_title"方法调用?否则,我将收到错误,因为该属性尚未定义.为什么我们需要手动执行?
我一直在使用Ruby进行PragProg 连续测试,在那里他们讨论IRB在当前类的上下文中调用以手动检查代码.
但是,他们引用如果你IRB.start在一个类中调用,self是预定义的,并引用我们在调用start时所在的对象,这在我的情况下是不正确的.
即使是非常简单的例子
a = "hello"
require 'irb'
ARGV.clear # otherwise all script parameters get passed to IRB
IRB.start
Run Code Online (Sandbox Code Playgroud)
当我尝试访问a变量时,我明白了
NameError: undefined local variable or method `a' for main:Object
Run Code Online (Sandbox Code Playgroud)
它仅在我更改a为全局变量时有效
$a = "hello"
require 'irb'
ARGV.clear # otherwise all script parameters get passed to IRB
IRB.start
Run Code Online (Sandbox Code Playgroud)
然后我可以访问它
irb(main):001:0> $a
=> 1
Run Code Online (Sandbox Code Playgroud)
有没有办法解决当前类中的本地和实例变量?
有没有办法在脚本/控制台环境中以表格格式显示Active Record结果?
我正在IRB中进行一些设计/调试,需要登录用户,然后才能在我的努力中使用current_user.
从Brian Deterling 对另一个问题的回答,我已经能够成功登录并使用以下顺序访问页面响应:
>> ApplicationController.allow_forgery_protection = false
>> app.post('/sign_in', {"user"=>{"login"=>"some-login-id", "password"=>"some-password"}})
>> app.get '/some_other_path_that_only_works_if_logged_in'
>> pp app.response.body
Run Code Online (Sandbox Code Playgroud)
注意:如果您收到200响应,则表示您尚未登录.您需要302重定向才能表示登录成功.看Tim Santeford的回答.
我已经能够得到会话信息:
1.9.3-p125 :009 > app.session
=> {"_csrf_token"=>"1yAn0jI4VWzUH84PNTH0lVhjpY98e9echQGS4=", "session_id"=>"89984667d30d0fec71f2a5cbb9017e24"}
Run Code Online (Sandbox Code Playgroud)
我用尽了一切我能想到的,试图去current_user通过app和app.session,但没有运气.我该怎么current_user办?
只是好奇它.
如果您打开IRB并输入_,您将获得nil响应:
irb(main):001:0> _
=> nil
Run Code Online (Sandbox Code Playgroud)
你可以修改它的值:
irb(main):002:0> _ = 'some value'
irb(main):003:0> _
=> "some value"
Run Code Online (Sandbox Code Playgroud)
但是,如果使用创建新变量_,则会修改其值:
irb(main):004:0> foo_bar = 'other value'
irb(main):005:0> _
=> "other value"
Run Code Online (Sandbox Code Playgroud)
为什么?这是一个设计决定吗?
基本上,我在终端打字很好,使用IRB运行ruby命令:
2.0.0-p0 :014 > bank_account.withdraw(2222)
=> -1222
Run Code Online (Sandbox Code Playgroud)
但有时我不小心错过了一个引号.
2.0.0-p0 :020 > BankAccount.create_for("Jim","Johnson)
2.0.0-p0 :021"> bank_account.withdraw(333)
Run Code Online (Sandbox Code Playgroud)
如果你仔细观察,你会发现我遗漏的语音标记出现在左边的行号旁边,旁边是补丁版本.
从现在开始,每次运行命令时都会出现该语音标记!它会阻止命令工作:
2.0.0-p0 :021"> BankAccount.create_for("Julian","Hurley")
2.0.0-p0 :022"> BankAccount.create_for("Katt","Smith")
2.0.0-p0 :023"> exec($0)
Run Code Online (Sandbox Code Playgroud)
我想知道的是,我该如何摆脱这个引号?或者从命令行退出IRB以重置它?
我在OS X 10.11.4上通过rbenv安装了Ruby 2.3.0p0.在IRB会议期间,历史记录正常.但是,我无法跨会话访问IRB历史记录.
我尝试了我的系统Ruby,2.0.0p648,IRB会话的历史记录工作正常.我尝试通过rbenv安装相同版本的Ruby,它也有工作历史.
我比较了IRB.conf工作会话和非工作会话之间的值,没有看起来不合适(尽管奇怪的是,在这两种情况下,irb/ext/save-history.rb都是空白文件).
查看我的.irb_history文件,它似乎被替换,而不是附加到最新会话的命令.我可以加载2.0.0 IRB会话并滚动这些命令就好了.
我已经尝试过rbenv irb历史记录中列出的答案并没有成功保存.
我也尝试了irb历史中选定的答案不起作用.我不得不改变选择的答案来替换#nitems方法.这表明正在从历史文件中读出行,并将其推送到Readline::HISTORY.然而,检查Readline::HISTORY显示没有.
通过将我的.irb_history中的前一行添加到Readline历史记录中Readline.readline,并指定add_hist = true,我可以破解历史.但是,绝对不是将以前的命令添加到Readline的正确方法.
我知道我可以切换到像撬的东西,但我想弄清楚这一点.有关为什么命令没有被添加到Readline的任何建议,以及如何更改它?
例如,在Python中,如果我想获取对象的所有属性,我可以做这样的事情:
>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'hexversion', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'py3kwarning', 'pydebug', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions']
Run Code Online (Sandbox Code Playgroud)
或者,如果我想查看某些内容的文档,我可以使用帮助功能:
>>> help(str)
Run Code Online (Sandbox Code Playgroud)
有没有办法在Ruby中做类似的事情?
当我进入irb并输入一个不存在的命令时,我收到一个错误说明
"undefined local variable or method 'my_method' for main:Object (NameError)"
Run Code Online (Sandbox Code Playgroud)
有没有办法获得可用的局部变量或方法的列表?这对于探索ruby非常有用.