是否可以从单个实例中删除方法?
class Foo
def a_method
"a method was invoked"
end
end
f1 = Foo.new
puts f1.a_method # => a method was invoked
Run Code Online (Sandbox Code Playgroud)
我可以从已创建的对象中删除类a中的a_method:
class Foo
remove_method(:a_method)
end
Run Code Online (Sandbox Code Playgroud)
如果我从同一个对象调用a_method:
puts f1.a_method # => undefined method
Run Code Online (Sandbox Code Playgroud)
如果我创建另一个对象:
f2 = Foo.new
puts f2.a_method # => undefined method
Run Code Online (Sandbox Code Playgroud)
我怎样才能从特定的单个对象中删除方法?
我试图查看存储库历史记录中的提交,但仅针对具有特定扩展名的文件.
如果这是目录结构:
$ tree
.
??? a.txt
??? b
??? subdir
??? c.txt
??? d
Run Code Online (Sandbox Code Playgroud)
这是完整的历史:
$ git log --name-only --oneline
a166980 4
subdir/d
1a1eec6 3
subdir/c.txt
bc6a027 2
b
f8d4414 1
a.txt
Run Code Online (Sandbox Code Playgroud)
如果我想查看扩展名为.txt的文件的日志:
$ git log --oneline *.txt
f8d4414 1
Run Code Online (Sandbox Code Playgroud)
它仅返回当前目录中的文件,而不返回子目录中的文件.我想在当前目录中包含所有可能的子目录.
我也尝试过:
$ git log --oneline */*.txt
1a1eec6 3
Run Code Online (Sandbox Code Playgroud)
和:
$ git log --oneline *.txt */*.txt
1a1eec6 3
f8d4414 1
Run Code Online (Sandbox Code Playgroud)
这适用于这种情况,但对于更通用的情况则不实用.
和:
$ git log --oneline HEAD -- *.txt
f8d4414 1
Run Code Online (Sandbox Code Playgroud)
没有成功.
我有这个一对多的关系:
class Programa < ActiveRecord::Base
attr_accessible :descripcion, :nombre, :roles_attributes
has_many :roles, :dependent => :restrict
accepts_nested_attributes_for :roles
...
end
class Role < ActiveRecord::Base
attr_accessible :description, :name, :programa_id
belongs_to :programa
...
end
Run Code Online (Sandbox Code Playgroud)
它适用于rails控制台:
> params = { programa: { nombre: 'nuevo', roles_attributes: [ {name: 'role1'}, {name: 'role2'}] }}
> p = Programa.create(params[:programa])
> p
=> #<Programa id: 7, nombre: "nuevo", descripcion: nil, created_at: "2013-10-09 14:07:46", updated_at: "2013-10-09 14:07:46">
> p.roles
=> [#<Role id: 15, name: "role1", description: nil, created_at: "2013-10-09 14:07:46", updated_at: …Run Code Online (Sandbox Code Playgroud) 我正在学习一些元编程,我一直试图找到一种方法.假设我有以下课程:
class MyClass
def self.my_method
end
def your_method
end
end
Run Code Online (Sandbox Code Playgroud)
使用以下代码,我可以在对象空间中搜索每个方法:
type = Class
name = /^my_method$/
result = ObjectSpace.each_object(type).select do |o|
o.instance_methods(false).grep(name).size > 0 || o.methods.grep(name).size > 0
end
p result
Run Code Online (Sandbox Code Playgroud)
它发现它显示以下输出:
[MyClass]
Run Code Online (Sandbox Code Playgroud)
由于搜索器代码还搜索实例方法,因此在查找your_method时会显示相同的输出.
即使我向对象添加单例方法:
mc = MyClass.new
def mc.our_method
end
Run Code Online (Sandbox Code Playgroud)
只需更改搜索者:
type = Object
name = /^our_method$/
result = ObjectSpace.each_object(type).select do |o|
o.methods.grep(name).size > 0
end
p result
Run Code Online (Sandbox Code Playgroud)
它还发现:
[#<MyClass:0x8f86760>]
Run Code Online (Sandbox Code Playgroud)
问题是,如何找到顶级对象中定义的方法?这个方法:
def hidden
end
Run Code Online (Sandbox Code Playgroud)
此外,在定义这样的方法时,哪个是当前类?
我正在尝试使用json格式对其所有动词进行Grape API回答.问题是我无法以json格式回答路由错误.我甚至无法解救ActionController :: RoutingError.
我已经阅读了这个链接https://github.com/intridea/grape/pull/342并且我已经将cascade指令设置为false,但API仅以纯文本形式回答"Not Found".
$ curl -X GET http://localhost:3000/api/wrong_uri
Not Found
Run Code Online (Sandbox Code Playgroud)
使用详细选项:
$ curl -X GET http://localhost:3000/api/wrong_uri -v
* About to connect() to localhost port 3000 (#0)
* Trying 127.0.0.1... connected
> GET /api/wrong_uri HTTP/1.1
> User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:3000
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Content-Type: text/html
< Cache-Control: no-cache
< X-Request-Id: 3cc74a78-3295-4c1f-b989-66d6fac50e5c
< X-Runtime: 0.002980
< Server: WEBrick/1.3.1 (Ruby/2.1.1/2014-02-24)
< Date: Tue, 06 …Run Code Online (Sandbox Code Playgroud) 我在Debian服务器(ip 192.168.1.193)中运行rails应用程序,并且乘客是独立的
$ cd /home/hector/webapps/first
$ passenger start -a 127.0.0.1 -p 3000
Run Code Online (Sandbox Code Playgroud)
我想提供这个应用程序将Nginx与反向代理一起扔在不同的子文件夹中:
http://192.168.1.193/first
Run Code Online (Sandbox Code Playgroud)
我的nginx.conf服务器:
...
server {
listen 80;
server_name 127.0.0.1;
root /home/hector/webapps/first/public;
passenger_base_uri /first/;
location /first/ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
}
}
...
Run Code Online (Sandbox Code Playgroud)
然后我运行Nginx服务器
$ /opt/nginx/sbin/nginx
Run Code Online (Sandbox Code Playgroud)
使用此配置运行一个rails应用程序似乎一切正常.
但是当我尝试添加我的第二个应用程序时
$ cd /home/hector/webapps/second
$ passenger start -a 127.0.0.1 -p 3001
Run Code Online (Sandbox Code Playgroud)
使用此nginx.conf文件:
...
server {
listen 80;
server_name 127.0.0.1;
root /home/hector/webapps/first/public;
passenger_base_uri /first/;
location /first/ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
}
}
server {
listen 80;
server_name 127.0.0.1; …Run Code Online (Sandbox Code Playgroud)