小编t6d*_*t6d的帖子

当我使用Bundler时,为什么要关心RVM的Gemset功能?

我只是不明白.我想,Bundler的开发是为了解决宝石之间的版本冲突.因此我require "bundler/setup"知道Bundler将加载我所有宝石及其依赖项的正确版本.现在,RVM非常适合管理多个Rubies,我知道,但为什么我应该关心Gemset功能呢?我在这里想念一下吗?它能使我的开发更容易吗?也许,你们中的一些人可以给我一些关于开发和生产的完美RVM + Bundler工作流程的一些提示.

我也不知道RVM何时开始切换到另一个Ruby.我知道.rvmrc我的项目中可以有一个文件,但是我必须cd到这个目录才能进行切换吗?

此外,我通常使用Passenger进行开发,因为Passenger.prefpaneMac OS中集成非常棒.我还能用RVM做到这一点还是有更好的方法呢?Passenger是否识别.rvmrc文件并切换到正确的Gemset?

ruby workflow passenger bundler rvm

41
推荐指数
2
解决办法
4992
查看次数

如何从Sinatra中转储HTTP请求?

有没有办法以应用程序接收数据的确切方式将所有传入请求转储到Sinatra应用程序?也许是某种Rack中间件?

ruby rack sinatra

23
推荐指数
2
解决办法
3万
查看次数

如何在Rails 3中为社交网络应用程序实现友谊模型?

我目前正在开发一个小型社交网络应用程序,现在我正在尝试创建一个代表用户之间友谊的模型.这是我到目前为止提出的:

class User < ActiveRecord::Base

  # ...
  has_many :friendships
  has_many :friends, :through => :friendships

end

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => 'User'
end
Run Code Online (Sandbox Code Playgroud)

我的友谊模型有一个确认为布尔值的字段,我想用它来定义一个待定或确认的友谊.

如何访问特定用户的所有待处理请求?我可以使用Rails的范围方法以某种方式定义它吗?就像是

current_user.friendships.requests # => [Friendship, Friendship, ...]
Run Code Online (Sandbox Code Playgroud)

会很好.

如何使这种关联双向化?一旦确认了朋友请求,我就会添加另一个友谊,这样我的友谊表看起来就像这样:

| user_id | friend_id | confirmed |
-----------------------------------
| 1       | 2         | true      |
| 2       | 1         | true      |
Run Code Online (Sandbox Code Playgroud)

ruby activerecord ruby-on-rails has-many-through

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

Ruby metaclass疯狂

我被卡住了.我正在尝试动态定义一个类方法,我无法绕过ruby元类模型.考虑以下课程:

class Example

  def self.meta; (class << self; self; end); end

  def self.class_instance; self; end

end

Example.class_instance.class # => Class
Example.meta.class           # => Class

Example.class_instance  == Example      # => true
Example.class_instance  == Example.meta # => false
Run Code Online (Sandbox Code Playgroud)

显然,这两个方法都返回Class的实例.但这两个实例并不相同.他们也有不同的祖先:

Example.meta.ancestors            # => [Class, Module, Object, Kernel]
Example.class_instance.ancestors  # => [Example, Object, Kernel]
Run Code Online (Sandbox Code Playgroud)

在元类和类实例之间做出改变有什么意义?

我想,我可以send :define_method向元类动态定义一个方法,但是如果我尝试将它发送到类实例它将无法工作.至少我可以解决我的问题,但我仍然想知道它为什么这样工作.

更新2010年3月15日13:40

以下假设是否正确.

  • 如果我有一个调用self.instance_eval并定义方法的实例方法,它只会影响该类的特定实例.
  • 如果我有一个调用self.class.instance_eval的实例方法(它与调用class_eval相同)并定义一个方法,它将影响该特定类的所有实例,从而产生一个新的实例方法.
  • 如果我有一个调用instance_eval的类方法并定义一个方法,它将为所有实例生成一个新的实例方法.
  • 如果我有一个类方法在meta/eigen类上调用instance_eval并定义一个方法,它将导致一个类方法.

我觉得它开始对我有意义了.如果类方法中的self指向特征类,那肯定会限制你的可能性.如果是这样,就无法从类方法中定义实例方法.那是对的吗?

ruby metaprogramming metaclass dynamic class-method

14
推荐指数
2
解决办法
4512
查看次数

如何从其他Ruby脚本调用标准Rakefile中定义的Rake任务?

是否可以从其他Ruby脚本中调用在Rakefile- 而不是somefile.rake- 中定义的任务?

我希望创建一个新的Rake::Application会自动加载Rakefile来自同一目录,但似乎并非如此.这是我到目前为止提出的:

$LOAD_PATH.unshift File.dirname(__FILE__)
require 'rake'
require 'pp'

rake = Rake::Application.new
rake[:hello].invoke
Run Code Online (Sandbox Code Playgroud)

执行此代码会导致以下结果:

/opt/ruby/1.9.2-p180/lib/ruby/1.9.1/rake.rb:1720:in `[]': Don't know how to build task 'hello' (RuntimeError)
from script.rb:7:in `<main>'
Run Code Online (Sandbox Code Playgroud)

pp rake 产生以下结果:

#<Rake::Application:0x00000101118da0
 @default_loader=#<Rake::DefaultLoader:0x00000101118b20>,
 @imported=[],
 @last_description=nil,
 @loaders=
  {".rb"=>#<Rake::DefaultLoader:0x00000101118a80>,
   ".rf"=>#<Rake::DefaultLoader:0x000001011189b8>,
   ".rake"=>#<Rake::DefaultLoader:0x00000101118800>},
 @name="rake",
 @original_dir=
  "/Users/t6d/Projects/Sandbox/Ruby/rake-from-ruby-script",
 @pending_imports=[],
 @rakefile=nil,
 @rakefiles=["rakefile", "Rakefile", "rakefile.rb", "Rakefile.rb"],
 @rules=[],
 @scope=[],
 @tasks={},
 @top_level_tasks=[],
 @tty_output=false>
Run Code Online (Sandbox Code Playgroud)

它是某种刺激性即@rakefilenil.

中欧时间5月20日下午4:40更新

在阅读了rake源代码一段时间之后,我发现你需要调用Rake :: Application#init来初始化你新创建的rake应用程序:

rake = Rake::Application.new
rake.init
rake.load_rakefile
Run Code Online (Sandbox Code Playgroud)

但是,我仍然无法调用我的Rakefile中定义的任何任务:

rake.top_level_tasks # => ["default"] …
Run Code Online (Sandbox Code Playgroud)

ruby rake

14
推荐指数
2
解决办法
6574
查看次数

如何在Latex函数下面放置一个字符?

是否可以在Latex中将字符或公式放在较大公式的其他部分下面?

foo f(x) = ...
 x
Run Code Online (Sandbox Code Playgroud)

如果这个例子不清楚.我想制作一个自定义函数 - 只是\text{foo}在数学环境中定义- 看起来像sum,min或max之类的内置函数,它接受放在函数符号上方或下方的参数.

简单地使用\text{foo}_x不起作用.

math latex

9
推荐指数
2
解决办法
4万
查看次数

是否有以各种格式序列化和反序列化对象层次结构的模式?

给定一个复杂的对象层次结构,幸运地不包含循环引用,如何实现支持各种格式的序列化?我不是来讨论实际的实现.相反,我正在寻找可能派上用场的设计模式的提示.

更准确一点:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构.此外,应该可以将此层次结构序列化为JSON,XML和可能的HTML.

我可以使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据 - 无论是在内存中还是在文本中 - 我都想用它来构建其他东西.

我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松地支持多种XML格式.

ruby architecture serialization design-patterns

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

如何更改MongoDB的map-reduce结果?

当我在Mongo数据库上运行Map-Reduce时,我通常会得到类似于以下内容的结果:

{ _id: <some-id>, value: { <first-key>: <first-value>, ... } }
Run Code Online (Sandbox Code Playgroud)

有没有办法省略该value: { ... }部分并直接插入value结果中的内容?基本上,我希望得到如下结果:

{ _id: <some-id>, <first-key>: <first-value>, ... }
Run Code Online (Sandbox Code Playgroud)

这样我就可以将结果合并回一个遵循这种格式的现有集合.

我还有一个关于Map-Reduce的另一个问题:是否可以通过a mapreduce函数访问另一个集合?

mapreduce mongodb

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

我是否需要将Bundler本身添加到Gemfile中?

当我使用Bundler时,是否需要将自己列为我的Gemfile中的依赖项?毕竟,我的代码中有些地方需要它.例如,当我在做Bundler设置时:require "bundler/setup"

ruby dependencies bundler

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

如何通知UITableViewController数据已准备好显示?

我有一个UITableViewController,我想通知一次相应的模型的数据已经能够显示.问题是这些数据是从Web服务获取的,请求可能需要几秒钟.目前,我正在主线程上同步获取数据,这当然导致我的主线程被阻塞.现在,我不希望我的控制器知道有关从互联网下载数据的任何信息.我怎样才能做到这一点.目前,我正在考虑使用GCD并实现类似的方法,-loadDataWithCallback:并提供一个触发[tableView reloadData]成功的回调.这是一个好方法吗?是否有其他可能通知控制器模型准备好了?我的另一个想法是使用委托机制并将控制器设置为我的模型的委托?

总结一下,有什么更好的:带回调的GCD或实现自己的委托机制?

还有其他可能吗?


更新:2011年6月24日13:15 CET

阅读完所有回复后,我得出结论,我的问题有三种可能的解决方案:

  1. 利用NSNotifications并使用NSURLConnection实现异步.下载

  2. 实现自定义协议并使用委派机制.再次,用于NSURLConnection实现异步.下载.

  3. 在单独的GCD队列中使用同步下载并使用回调.

由于没有人赞成最后的解决方案,我想深入讨论这种方法.在看到通知处理中涉及的所有代码之后,我认为GCD是一种更好的方法.而不是同意某个必须以某种方式记录的通知,以便每个开发人员都知道它,我可以简单地使用回调.一方面,它给了我一个清晰的界面,就像我在使用代表时所拥有的那样,另一方面,它给了我完全的灵活性.你真的认为GCD要复杂吗?这是我的代码:

- (void)loadRestaurantsWithCallback:(void (^)())callback
{
    dispatch_queue_t current_queue = dispatch_get_current_queue();
    dispatch_queue_t download_queue = dispatch_queue_create("Download queue", NULL);

    dispatch_async(download_queue, ^{
        self.restaurants = [self loadRestaurants];
        dispatch_async(current_queue, ^{ callback(); });
    });

    dispatch_release(download_queue);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我的应用程序只显示我大学不同食堂的菜单.

在我的控制器中,我只是执行以下操作:

if (![self.canteen hasRestaurants]) {
    [self.canteen loadRestaurantsWithCallback:^{
        [self.tableView reloadData];
    }];
}
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力.您对此解决方案有何看法?


更新:2011年6月24日16:30 CET

这个问题有第四种解决方案,即使它涉及的代码多于GCD方法,也可能是这样的方法.这是我想出的:

  1. 用于NSURLConnection进行异步下载.

  2. 让您的模型响应NSURLConnection实例发送的回调.

  3. 使用键值编码键值观察.

在您的控制器中,您只需执行以下操作: …

iphone asynchronous objective-c uitableview grand-central-dispatch

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