小编Mar*_*ing的帖子

在Rails 3中删除ActiveRecord

现在Rails 3测试版已经发布了,我想我会重新编写一个我刚刚开始在Rails 3测试版上工作的应用程序,这两个版本都是为了感受它并获得一些启动.该应用程序使用MongoDB和MongoMapper的所有模型,因此不需要ActiveRecord.在以前的版本中,我按以下方式卸载activerecord:

config.frameworks -= [ :active_record ]    # inside environment.rb
Run Code Online (Sandbox Code Playgroud)

在最新版本中,这不起作用 - 它只是抛出一个错误:

/Library/Ruby/Gems/1.8/gems/railties-3.0.0.beta/lib/rails/configuration.rb:126:in
  `frameworks': config.frameworks in no longer supported. See the generated 
  config/boot.rb for steps on how to limit the frameworks that will be loaded 
  (RuntimeError)
 from *snip*
Run Code Online (Sandbox Code Playgroud)

当然,我已经按照它的建议查看了boot.rb,但据我所知,这里没有任何关于如何卸载AR的线索.我需要这样做的原因是因为加载一些我不想要的东西不仅是愚蠢的,而且即使我试图为控制器运行一个生成器时它也无法建立数据库连接.这是因为我已经擦除database.yml并用MongoDB的连接细节替换它,以便使用这个要点将database.yml用于MongoDB连接细节.不知道为什么它需要能够启动数据库连接才能生成控制器....

有人知道正确的Rails 3方式吗?

ruby-on-rails ruby-on-rails-3

99
推荐指数
5
解决办法
4万
查看次数

在自己的目录之外运行一个Bundler部署的Ruby应用程序?

我正在编写一个基于Ruby的守护进程,以便在我的一个Ubuntu服务器上运行.我希望这能在启动时运行,因此将为它编写一个upstart作业文件.但是,我使用了bundler来管理它使用的各种gem,并打算在将它部署到服务器后执行此操作:

bundle install --deployment
Run Code Online (Sandbox Code Playgroud)

这将捆绑器置于所谓的"部署模式"中,从而设置了各种选项,并且所有宝石都安装在"供应商"目录中而不是系统范围内.然而,这会产生运行它的问题,因此必须从它自己的目录执行,因为这是宝石结束的地方:

<in the app's dir>
$ ./runmyapp
<it runs>
Run Code Online (Sandbox Code Playgroud)

如果我cd到另一个位置,然后尝试使用它的完整路径运行它,它会失败:

<in another directory>
$ /path/to/runmyapp
<it crashes as it can't locate its gems>
Run Code Online (Sandbox Code Playgroud)

我已阅读了大量的捆绑文档,这整个场景甚至从未被涵盖过?我应该将宝石安装到系统中吗?还有什么我应该做的吗?

ruby rubygems bundler

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

使用OAuth 2和服务帐户访问旧的GData API(电子表格API)

简短的问题是这是否可能,如果可能,如何?

大纲

我有一个.NET应用程序,它目前使用服务帐户使用Google Drive API访问Google Apps域中的信息.这可以正常使用google-api-dotnet-client库和代码沿着这里的示例所示的相同行- 这是目前我正在做的一个非常好的基本示例.

我现在要做的是扩展它以及使用 "新"google-api-dotnet-client库提供那些API,它使用旧的"GData"库,通过较旧的google-gdata库提供,特别是Spreadsheets API(也许还有更多).

问题

这就是出现困难的地方.前一个库完全符合我的要求,正如上面第一段中的第二个链接所证明的那样 - 以及我自己做它的事实.但是 ......虽然第二个库已经更新,除了OAuth 1.0和其他旧的auth技术之外还支持OAuth 2.0,但据我所知,从广泛的谷歌搜索和跟踪错误中可以看出,"代表我所有用户的服务帐户"我需要的操作.

我的问题是我是否遗漏了一些东西(可能很难找到或没有记载的东西),这些东西可以让我做我想做的事.如果不这样做,有什么方法可以强迫这种行为并使这两个库并排运行?

理想的解决方案

理想情况下,我希望某种方式让Google.GData.Spreadsheets.SpreadsheetsService实例能够利用Google.Apis.Authentication.Auth2Authenticator<AssertionFlowClient>我已经在使用的实例...不知何故.这种巫术有可能吗?我错过了那个显而易见的东西吗?

如果不这样做,我很高兴再次完成整个OAuth2"断言流客户端"的舞蹈,如果我不得不以某种方式让旧库可以处理.

救命?

其他想法

我考虑过 - 暂时拒绝 - 选择从头开始编写我自己的库来实现这一目标.这有两个原因:

  1. gdata库已经存在,并且已经被许多人开发,可能比我自己聪明.我不是那么傲慢,我相信我能做得更好.
  2. 我不确定这些旧API上是否支持/允许使用服务帐户方法的OAuth2.

我一直希望避免但可能不得不依赖于此处的答案的另一种方法是使用2脚OAuth 1.0来实现这一点.我宁愿不这样做,因为应用程序的某些部分依赖于一种旧的auth方法,而其他部分则使用这种新方式对我来说感觉不对.而且还有更多的问题......


更新

我已经考虑过继承GDataRequestFactory和GDataRequest的可能性,所以我可以创建自己的请求工厂,然后获取Google.Apis.Authentication.Auth2Authenticator<AssertionFlowClient>(好的,Google.Apis.Authentication.IAuthenticator无论如何的实例)的实例,它可以在调用之前调试请求.但是...... GDataRequest的构造函数是内部的,这已经阻止了我.

它真的看起来不是这个意思.

.net c# gdata-api oauth-2.0 google-spreadsheet-api

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

网站版本号 - 有用还是毫无意义?

个人网站和我参与的其他网站)在页脚或网站的其他区域谨慎地显示其当前版本号.我的问题是这对于访问者是否是有用的信息,还是它的文本"噪音".

值得注意的是,版本号是软件的版本(不是博客中的数据或其他),因此与"此站点上的内容有多大"的观点无关.

由于在任何给定的时间点只有一个版本的站点处于活动状态并且它不是重新分发的产品,版本号是否可用于任何目的?我理解这是一个主观问题,但我想对此进行评估,以指导有关版本号及其相关性的未来决策.

versioning

10
推荐指数
2
解决办法
8493
查看次数

将SVN repo的一部分复制到新的仓库?

目前,我有一个庞大的SVN存储库,其中包含许多不同的项目,如下所示:

/
 Project1/
          trunk/
          tags/
          branches/
 Project2/
          trunk/
          tags/
          branches/
 Project3/ 
          (etc...)
Run Code Online (Sandbox Code Playgroud)

但是,我现在正试图将其分解为单独的存储库(由于各种原因),并且我希望每个项目都有以下内容:

/
 trunk/
 tags/
 branches/
Run Code Online (Sandbox Code Playgroud)

如果可能,所有历史和外部都应保持不变.但是,我不确定这是否可以实现.我在SO上看过几个与此类似的问题,但没有一个完全解决我在这里遇到的问题.基本上我试图从旧存储库中"拉出"一个子目录及其全部内容和历史记录,并将整个数据放入其自己的(新)存储库中.

我问不可能吗?

svn version-control

8
推荐指数
2
解决办法
3231
查看次数

在部署到子URI时,Rails 3.1中的预编译资产损坏

我正在更新Rails 3应用程序以使用Rails 3.1,作为其中的一部分,我正在利用新的资产管道.到目前为止,我已经把一切都解决了一个我无法解决的相当恼人的问题.

应用程序及其所有资产在开发中运行良好,但在生产中,它使用Passenger(http://the-host/sub-uri/)部署到子URI .这个问题是资产是在部署期间预编译的,我的一个CSS(好吧,它是一个.css.scss文件)文件正在利用gem 中的image-url帮助程序sass-rails.由于在预编译过程中,路径被硬编码到预编译的CSS文件中,因此不考虑子uri:

在我的.css.scss档案中:

body { background-image: image-url("bg.png"); }
Run Code Online (Sandbox Code Playgroud)

编译application-<md5-hash-here>.css文件中的结果:

body { background-image: url(/assets/bg.png); }
Run Code Online (Sandbox Code Playgroud)

它应该是什么使它正常工作:

body { background-image: url(/sub-uri/assets/bg.png); }
Run Code Online (Sandbox Code Playgroud)

这个场景只是要求太多了吗?如果是这样,我将不得不切换回旧的非资产流水线方式,只需提供我的图像和CSS public.然而它似乎应该被考虑和解决的东西......?我错过了解决方案吗?


编辑1:我应该注意,使用erb解决方案会产生与预期相同的结果.


编辑2:回应Benoit Garret的评论

不,问题与此无关config.assets.prefix.我尝试设置(/sub-uri/assets而不是默认值/assets),但事实证明这是错误的做法 - 似乎这个设置已经与Rails应用程序的根目录有关,而不是服务器.删除它(从而恢复到默认值)已经修复了所有引起的奇怪问题(并且有很多,所有资产都进入了/sub-uri/sub-uri/assets- 这一切都非常奇怪).唯一的问题是image-url帮助者和朋友在预编译时不会获取子URI.毋庸置疑,这是合乎逻辑的,因为当它被预编译时,它不可能知道当它在Passenger下运行时,它将以这种方式配置.我的问题是如何告知它,从而最终得到预编译结果中的正确路径.如果确实可以做到的话.

我目前的解决方法是像这样引用CSS中的iamge:url(../images/bg.png)并将其放在非流水线public/images位置.很难理想,因为它不会受益于指纹和管道提供的一切.

assets passenger ruby-on-rails-3.1 sprockets asset-pipeline

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

为什么我的控制器的实例变量在视图中不起作用(Rails)

我想在我的控制器中添加几个实例变量,因为在多个动作的视图中需要有问题的变量.但是,下面的示例并不像我预期的那样有效.

class ExampleController < ApplicationController
  @var1 = "Cheese"
  @var2 = "Tomato"

  def show_pizza_topping
    # What I want is the above instance vars from within the view here
  end

  def show_sandwich_filling
    # What I want is the above instance vars from within the view here
  end
end
Run Code Online (Sandbox Code Playgroud)

据我了解,Rails从控制器获取实例变量并使其在视图中可用.如果我在动作方法中分配相同的变量,它工作正常 - 但我不想做两次.为什么我的方式不起作用?

(注意:这是一个垃圾的例子,但我希望它有意义)

编辑:我在这里找到了这个问题的答案:什么时候Ruby实例变量设置?

编辑2:何时是使用诸如before_filter和initialize方法之类的过滤器的最佳时间?

ruby scope ruby-on-rails instance-variables

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

在多个块的视图中产量

我正在编写一个基于Sinatra的小应用程序,并希望每个视图能够将各种项目插入到布局中,例如页面title或其他CSS/javascript引用head.

目前我的布局(erb)看起来像这样(简化):

<html>
<head>
    <title>Hard Coded Title Here</title>
    <link rel="stylesheet" ... />
</head>
<body>
    <h1>Hard Coded Title Here</h1>
    <div id="content">
        <%= yield %>
    </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我不想将标题和CSS/JS引用硬编码,而是希望通过以下方式实现:

<html>
<head>
    <title><%= yield :title %></title>
    <link rel="stylesheet" ... />
    <%= yield :more_head_refs %>
</head>
<body>
    <h1><%= yield :title %></h1>
    <div id="content">
        <%= yield %>
    </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

并且能够在每个视图中定义这些块的内容.

这是可能的,如果是这样,我该如何去做呢?

ruby layout erb sinatra

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

NHibernate缓存/删除问题?

我正在使用NHibernate并在我的NHibernate配置中指定了缓存区域:

<cache region="HalfHour" expiration="1800" priority="3" />
Run Code Online (Sandbox Code Playgroud)

我有一个实体定义(UserDefinedGroup)设置为在读写模式下使用此缓存区域:

<class name="UserDefinedGroup" table="Message_Groups">
    <cache region="HalfHour" usage="read-write" />
    ...
</class>
Run Code Online (Sandbox Code Playgroud)

我还有一个HQL查询,它设置为使用查询缓存,因为它返回大量UserDefinedGroup实例:

var results = Session.CreateQuery("from UserDefinedGroup order by Name")
                .SetCacheable(true)
                .SetCacheRegion("HalfHour")
                .List<UserDefinedGroup>();
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试删除一个实例时,UserDefinedGroup即使实体设置为使用读写缓存,我也会收到以下错误.

ReadOnlyCache:无法写入只读对象Cristal.Model.UserDefinedGroups.UserDefinedGroup

我是否完全忽略了NHibernate缓存的观点或误解?我希望这可以执行删除和缓存适当地处理自己,但显然这不会发生.

.net nhibernate caching

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

使用 Google 帐户通过非 Google API 验证 Chrome 扩展程序

我在一家教育机构工作,该机构大量使用 Google Apps,现在又使用 ChromeOS 设备。我们着手的一个项目是开发一个 Chrome 扩展(可能是多个),它将复制我们在 Windows 环境中拥有的功能。这些仅在我们的域内和我们的设备上使用,一般不可用。

我们内部构建了一个基于 HTTP/JSON 的 API,它提供了各种详细信息,例如来自我们的 MIS(同样是内部构建)的提醒和其他内容,并且可以提供包含此信息的弹出窗口等。可以通过 Windows 下的 NTLM 身份验证确保 API 知道当前用户是谁。

我需要某种方式让 API 能够在从 Chrome 设备访问时知道用户是谁。这意味着扩展程序需要能够以安全的方式告诉 API 用户是谁。如果 API 可以确定登录用户的 Google Apps 电子邮件地址,则它可以从我们的数据库中确定此人是谁。我的问题是,我该如何实现这一目标?

一些已考虑并拒绝的解决方案:

  • 让扩展程序简单地告诉 API 当前用户的电子邮件地址
    被拒绝,因为它很容易被伪造。这必须是安全的。
  • 改为询问用户的 Active Directory 凭据
    该扩展程序应该能够在无需用户输入的情况下运行 - 我们可以代表用户针对 Google Apps 域授权该扩展程序。

此外,用于登录的 Google OAuth 2.0 似乎特定于浏览器中显示的网站。这需要默默地处理。

我知道这是一个非常模糊的问题,但是任何正在解决的非常相似问题的建议或示例将不胜感激。其核心是:如何使用 Google 凭据让 Chrome 扩展程序通过非 Google API 进行身份验证?(可以扩展 API 以以任何必要的方式支持这一点。)


一些进一步的细节:

  • 我们的 API 基于 .NET
  • Chrome 扩展程序将仅在学院内的我们的设备上运行,并且这些设备将注册到我们的域。只有该域内的用户才会登录并运行该扩展。

.net asp.net-mvc google-api google-apps google-chrome-extension

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

pyparsing中的可选字符串段

我正在使用pyparsing并尝试定义两个项目,如下所示:

identifier = Word(alphas, alphanums).setName('identifier)

database_name = Optional(identifier.setResultsName('user') + Suppress('.')) + identifier.setResultsName('database')
table_name = database_name + Suppress('.') + identifier.setResultsName('table')
Run Code Online (Sandbox Code Playgroud)

这个想法是匹配table_name,它将带有两个或三个段的字符串,并导致以下结果:

mark.foo.bar
=> tokens.user = 'mark'
   tokens.database = 'foo'
   tokens.table = 'bar'
Run Code Online (Sandbox Code Playgroud)

或者如果缺少第一个段:

foo.bar
=> tokens.user = ''  #anything is acceptable: none, empty string or just plain missing
   tokens.database = 'foo'
   tokens.table = 'bar'
Run Code Online (Sandbox Code Playgroud)

table_name如上所述,应始终有两个段和一个点,或三个段(两个点).一段是不可接受的.

database_name 应该有一个段(数据库)或两个(user.database).

使用database_name工作正常的实例- 它将在一个或两个段上匹配.但是,table_name在某些情况下失败:

# Works for three segments
mark.foo.bar
=> tokens.user = 'mark'
   tokens.database = 'foo'
   tokens.table = …
Run Code Online (Sandbox Code Playgroud)

python pyparsing

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

DataMapper关联中的外键名称

我目前正在开发一个基于现有数据库的新应用程序,利用DataMapper进行数据访问.但是,它在处理外键时的约定不是数据库使用的.

例:

class Invoice
  include DataMapper::Resource

  storage_names[:default] = 'invoices'

  property :id, Serial
  # ... more properties ...

  has n, :items
end

class Item
  include DataMapper::Resource

  storage_names[:default] = 'invoiceItems'

  property :id, Serial
  # ... more properties ...

  belongs_to :invoice  # this should use 'invoiceId' instead of 'invoice_id'
end
Run Code Online (Sandbox Code Playgroud)

有没有什么办法可以让DataMapper使用的外键是'invoiceId',而不是它目前尝试使用的'invoice_id'(如上面的评论所示)?我知道这可以通过添加正常字段来完成,:field => 'fieldName'但我找不到关联的方法.

ruby datamapper

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