我是Rails的新手,并且正在学习Rails 3的侧面项目.有时我想编写一些不属于我的模型或我的控制器的代码 - 与模型和/或控制器相关的问题,但我不想将其中任何一个与实现细节混为一谈我在写什么
例如:我正在构建的项目使用Janrain的授权系统(RPX),因此我可以获得oauth,openid,google等授权.他们提供了很多很好的API代码,所以我不必自己编写.此代码不属于登录控制器或用户模块.它是授权代码,因此登录控制器需要访问它,但它不是该控制器的一部分.
你把这个代码放在哪里?它不是型号代码.它不属于控制器.
... 提前致谢.
我有一个Rails 3应用程序(使用Mongodb和Mongoid,如果这有所不同),并且在我的一个模型中,我有一个字段定义为日期类型.
class Participant
include Mongoid::Document
field :birth_date, :type => Date
end
Run Code Online (Sandbox Code Playgroud)
我的控制器正在使用mongo的find_or_initialize_by功能:
class ParticipantController
def create
@participant = Participant.find_or_initialize_by(params[:participant])
if @participant.save
redirect_to participants_path
else
render :new
end
end
end
Run Code Online (Sandbox Code Playgroud)
所有这些归结为:如何使用Mongoid和Rails 3在ActiveModel中进行日期验证?
我想确保在文本框中输入"blah"时不会在分配给.birth_date我的模型字段时引发异常.它应该提供一个很好的验证错误消息,而不使用控制器来进行验证.
这是基本要求:
视图必须是单个文本框.没有其他的.这是我们无法更改的用户要求
验证应该在模型中完成,而不是在控制器或
视图中(javascript或其他)
没有正则表达式格式验证(它们无法正常工作/支持区域设置等)
问题是文本框中的值被分配给.birth_datebefore validates_format_of并运行validates_presence_of.所以...
如何拦截值的赋值,以便在分配之前对其进行验证?是否可以使用ActiveModel在模型中执行此操作?或者这是否要求我在控制器中放置代码来执行此操作?
我正在构建一个审计跟踪,需要知道哪个用户当前正在发出请求.我的审计跟踪是使用ActiveSupport :: Notifications构建的,以接收需要审计的偶数.
我想要做的是使用ActiveSupport :: Concern封装逻辑以满足我的审计需求,这样我就可以轻松地将审计添加到我系统中的任何模型中.
一般来说,这很容易做到.我甚至在一段时间后发表了博客.但是,我很难弄清楚如何让当前用户向Web服务器发出请求,以便我可以记录谁在审计跟踪中进行了哪些更改.
我知道有很多关于"如何在我的模型中获得current_user"的问题,但我并不是要求在模型中进行,所以我希望有更好的答案.由于我的审计代码与基础架构相关,我希望有一些方法可以利用当前正在处理的请求,或者其他可以明确告诉我当前登录/发出请求的内容.
我已经阅读了许多说"使用线程存储并将current_user放在那里"的"答案".我不喜欢这个答案,因为其他人没有这个原因 - 不能保证线程存储是安全的.如果服务器使用相同的线程来处理多个请求等,它可能会导致多个请求流失.
所以...鉴于我不是试图从我的模型中访问current_user,而是从ActiveSupport :: Concern或ActiveSupport :: Notifications事件订阅中获取,有什么好的选择让我知道当前用户是谁?
更新
我正在使用设计进行身份验证,后端使用Warden.设计通过调用检索current_user request.env['warden'].authenticate(:scope => :user)(假设我使用"用户"模型进行身份验证).
我有办法request从我的关注或通知订阅中访问当前对象吗?回到我的.NET时代,我本来可以打电话HttpContext.Current.Request,一切都会好的.Rails中的等价物是什么?
是否有一些ruby代码我可以用来从本地文件安装gem,如果没有安装gem?
我认为它看起来像:
if !gem_installed("some gem name")
system "gem install -l local_copy.gem"
end
Run Code Online (Sandbox Code Playgroud)
我不知道是否存在让我检查这样的宝石的东西......
我正在hudson v1.362中设置参数化构建.我正在创建的参数用于确定在subversion中结帐的分支.
我可以像这样设置我的svn存储库URL:https://my.svn.server/branches/${branch}它可以完成结帐和构建.
现在我想在构建完成后标记它.我正在使用hudson的SVN标记插件来执行此操作.所以我转到hudson项目的项目配置屏幕的底部,然后打开"在成功构建时执行Subversion标记".
在这里,我设置了我的Tag Base URL https://my.svn.server/tags/${branch}-${BUILD_NUMBER},它给了我关于那些未找到的属性的错误.所以我将它们更改为这样的环境变量用法:https://my.svn.server/tags/${env['branch']}-${env['BUILD_NUMBER']}并且svn标记插件很高兴.
现在的问题是我顶部的svn存储库使用了${branch}语法和svn标记插件barfs:
moduleLocation: Remote ->https://my.svn.server/branches/$branch/
Tag Base URL: 'https://my.svn.server/tags/thebranchiused-1234'.
There was no old tag at https://my.svn.server/tags/thebranchiused-1234.
ERROR: Publisher hudson.plugins.svn_tag.SvnTagPublisher aborted due to exception
java.lang.NullPointerException
at hudson.plugins.svn_tag.SvnTagPlugin.perform(SvnTagPlugin.java:180)
at hudson.plugins.svn_tag.SvnTagPublisher.perform(SvnTagPublisher.java:79)
at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:36)
at hudson.model.AbstractBuild$AbstractRunner.perform(AbstractBuild.java:601)
at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:580)
at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:558)
at hudson.model.Build$RunnerImpl.cleanUp(Build.java:167)
at hudson.model.Run.run(Run.java:1295)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
at hudson.model.ResourceController.execute(ResourceController.java:88)
at hudson.model.Executor.run(Executor.java:124)
Finished: FAILURE
Run Code Online (Sandbox Code Playgroud)
注意第一行,那里:svn标签正在查看$ {branch}作为存储库url的一部分...它没有解析出属性值.
我试图更改svn的原始存储库URL以使用${env['branch']}语法,但这会破坏原始结帐,因为结帐时根本不会解析此语法.
救命?!
我如何使用参数化构建来设置结帐的svn url和标记我的构建?!
我正试图把HEAD放在一个物体上,而我却被禁止了403.为了使用REST API获取对象的HEAD,我需要具有哪些权限?
我有代码使用签名的URL来获取完整的对象内容...但当我切换到获取HEAD而不是获取完整的对象时,它给了我403禁止
我试图通过nodejs child_process运行一个简单的ssh命令.当我通过nodejs代码运行命令时,它无法说我找不到发送到服务器的命令.当我运行相同的命令只是复制和粘贴到我的终端窗口,它运行正常.
这是我正在尝试做的命令行版本:
ssh user@example.com 'ls -lai'Run Code Online (Sandbox Code Playgroud)
这是使用child_process的同一个ssh命令的nodejs版本
var cproc = require('child_process');
var exec = cproc.exec;
var spawn = cproc.spawn;
var command = "ssh";
var args = ["user@example.com", "'ls -lai'"];
var child = spawn(command, args);
child.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
child.stderr.on('data', function(data) {
console.log('stderr: ' + data);
});
child.on('close', function(code) {
console.log('exit code: ' + code);
process.exit();
});
Run Code Online (Sandbox Code Playgroud)
命令行版本的输出正是我所期望的...我得到目录列表.但是当我运行这个nodejs代码来执行相同的命令时,stderr回调代码启动,命令返回代码127(找不到命令).
$ node test-ssh.js
stderr: bash: ls -lai: command not found
exit code: 127
Run Code Online (Sandbox Code Playgroud)
根据这里的输出,找不到'ls -lai'命令......但这没有意义,因为当我从终端提示符直接运行它时它完全正常.
有谁知道为什么通过nodejs运行ssh会导致这种情况发生?
我已经使用 MongooseJSrevisionKey有一段时间了 -__v默认情况下,它包含在文档中的字段。我明白修订号的目的是什么,通常是什么时候更新。
我最近和一位朋友谈论了“矢量时钟”的想法,我提到了 MongoDB 和 MongooseJS 有这个__v领域。当时,听起来这可能是一个矢量时钟。但是在阅读了一些关于矢量时钟的内容后,现在我不确定。
所以我想知道:versionKeyMongooseJS的属性,以及__v它默认产生的字段,可以被认为是一个向量时钟吗?是或否,为什么?
我有一个非常基本的对象对象模型,由System.Xml.XmlSerialization东西序列化.我需要使用XmlAttributeOverrides功能为子元素集合设置xml元素名称.
public class Foo{
public List Bars {get; set; }
}
public class Bar {
public string Widget {get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用标准的xml序列化程序,这将成为
<Foo>
<Bars>
<Bar>...</Bar>
</Bars>
</Foo>
Run Code Online (Sandbox Code Playgroud)
我需要使用XmlOverrideAttributes来说明这一点
<Foo>
<Bars>
<SomethingElse>...</SomethingElse>
</Bars>
</Foo>
Run Code Online (Sandbox Code Playgroud)
但我似乎无法让它重命名集合中的子元素...我可以重命名集合本身...我可以重命名根...不知道我做错了什么.
这是我现在的代码:
XmlAttributeOverrides xOver = new XmlAttributeOverrides();
var bars = new XmlElementAttribute("SomethingElse", typeof(Bar));
var elementNames = new XmlAttributes();
elementNames.XmlElements.Add(bars);
xOver.Add(typeof(List), "Bars", elementNames);
StringBuilder stringBuilder = new StringBuilder();
StringWriter writer = new StringWriter(stringBuilder);
XmlSerializer serializer = new XmlSerializer(typeof(Foo), xOver);
serializer.Serialize(writer, someFooInstance);
string xml = stringBuilder.ToString(); …Run Code Online (Sandbox Code Playgroud) 我从昨天开始就是Backbone Marionette的新手,我想知道是否有人试图在视图之间实现一些奇特的转换.
实际上,我想在渲染下一个视图之前淡出当前视图.我在onBeforeClose回调中执行此操作,但这不能正常工作,因为在我当前视图完成转换之前,下一个视图渲染...
有小费吗?
谢谢
mongodb ×2
security ×2
amazon-s3 ×1
audit-trail ×1
backbone.js ×1
bash ×1
build ×1
c# ×1
date ×1
head ×1
hudson ×1
javascript ×1
marionette ×1
mongoose ×1
node.js ×1
organization ×1
overriding ×1
permissions ×1
ruby ×1
rubygems ×1
ssh ×1
svn ×1
tags ×1
theory ×1
validation ×1
vector-clock ×1