小编hec*_*tor的帖子

仅从实例中删除方法

是否可以从单个实例中删除方法?

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)

我怎样才能从特定的单个对象中删除方法?

ruby

11
推荐指数
1
解决办法
2133
查看次数

使用git查看与子目录中的特定文件扩展名相关的所有日志

我试图查看存储库历史记录中的提交,但仅针对具有特定扩展名的文件.

如果这是目录结构:

$ 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)

没有成功.

git git-log

11
推荐指数
1
解决办法
3041
查看次数

Rails形式与嵌套属性(accepts_nested_attributes_for)

我有这个一对多的关系:

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)

ruby-on-rails has-many nested-attributes

7
推荐指数
1
解决办法
8542
查看次数

顶层定义的方法在哪里存在?

我正在学习一些元编程,我一直试图找到一种方法.假设我有以下课程:

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)

此外,在定义这样的方法时,哪个是当前类?

ruby metaprogramming

4
推荐指数
1
解决办法
70
查看次数

Rails 4 Grape API ActionController :: RoutingError

我正在尝试使用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)

api ruby-grape ruby-on-rails-4

2
推荐指数
1
解决办法
1760
查看次数

Nginx + Passenger在不同的子URI中提供rails应用程序

我在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)

ruby-on-rails passenger nginx

1
推荐指数
1
解决办法
2322
查看次数