随着色器件一个使用before_filter :authenticate_user!来限制只能访问身份验证的用户.
当未经身份验证的用户尝试访问受限制的页面时,设计会自动导致重定向到登录页面.
因此,尝试打开http:// localhost:3000/users/edit将导致重定向到http:// localhost:3000/users/sign_in.
现在,如果我将链接http:// localhost:3000/users/edit as定义为:remote => true,则设计将仅通过JS 发出401状态代码.
我如何优雅地处理这种情况并在覆盖或重定向中显示登录对话框,因为非远程变体会这样做?
设计是否为我需要激活的情况提供默认策略?
在Rails 3.2中我使用这些路由声明:
get 'contact' => 'contact#new', :as => 'contact'
post 'contact' => 'contact#create', :as => 'contact'
Run Code Online (Sandbox Code Playgroud)
它们导致(rake routes):
contact_en GET /en/contact(.:format) contact#new {:locale=>"en"}
contact_de GET /de/kontakt(.:format) contact#new {:locale=>"de"}
contact_en POST /en/contact(.:format) contact#create {:locale=>"en"}
contact_de POST /de/kontakt(.:format) contact#create {:locale=>"de"}
Run Code Online (Sandbox Code Playgroud)
现在Rails 4.0抱怨这个配置:
无效的路由名称,已在使用中:'contact'您可能已使用该
:as选项定义了两个具有相同名称的路由,或者您可能正在覆盖已由具有相同命名的资源定义的路由.
显然,路由共享相同的名称,但由于请求类型不同,我希望它们像以前一样被接受.
如何告诉Rails 4在3.2中生成路由?
我正在尝试测试一种简单的服务方法.该方法主要只返回一个条件查询的结果,如果它返回一个结果,我想测试它(取决于查询的内容).
问题是,我不知道如何正确地对应相应的测试.我试图通过spock实现它,但是对任何其他测试方式做同样的事情也失败了.
可以告诉我如何修改测试以使其适用于手头的任务吗?
(顺便说一下,如果可能的话,我想把它作为单元测试.)
EventService方法
public HashSet<Event> listEventsForDate(Date date, int offset, int max) {
date.clearTime()
def c = Event.createCriteria()
def results = c {
and {
le("startDate", date+1) // starts tonight at midnight or prior?
ge("endDate", date) // ends today or later?
}
maxResults(max)
order("startDate", "desc")
}
return results
}
Run Code Online (Sandbox Code Playgroud)
Spock规范
package myapp
import grails.plugin.spock.*
import spock.lang.*
class EventServiceSpec extends Specification {
def event
def eventService = new EventService()
def setup() {
event = new Event() …Run Code Online (Sandbox Code Playgroud) 我有一些经常使用的帮助方法,用于将单元测试放入单独的文件中.例如,我的想法是允许我的XYZTests.groovy调用TestHelper.getUserObject()以获得完全初始化的User实例.
现在问题是,springSecurityService.encodePassword(pw)在用户中有一个被调用的东西beforeInsert()总是失败,因为TestHelper.groovy中没有模拟 springSecurityService.
java.lang.NullPointerException: Cannot invoke method encodePassword() on null object
Run Code Online (Sandbox Code Playgroud)
在User.groovy中:
def beforeInsert() {
// ...
password = springSecurityService.encodePassword(pw)
// ...
}
Run Code Online (Sandbox Code Playgroud)
注意:我想避免在 TestHelper.groovy中进行任何模拟,以便在集成测试中使用它的方法.
尽管如此,即使我尝试mockFor()在TestHelper.groovy中调用任何地方,我也会得到一个MME:
No signature of method: static myproject.TestHelper.mockFor() is applicable for argument types: (java.lang.Class, java.lang.Boolean) values: [class grails.plugins.springsecurity.SpringSecurityService, true]
groovy.lang.MissingMethodException: No signature of method: static myproject.TestHelper.mockFor() is applicable for argument types: (java.lang.Class, java.lang.Boolean) values: [class grails.plugins.springsecurity.SpringSecurityService, true]
at myproject.TestHelper.mockSpringSecurityService(TestHelper.groovy:59)
at myproject.TestHelper$mockSpringSecurityService.callStatic(Unknown Source) …Run Code Online (Sandbox Code Playgroud) 我在/ etc/sudoers中有这个:
%wheel myhostname =NOPASSWD: /bin/bash -c "echo foo && echo bar", \
/bin/bash -c echo foo
Run Code Online (Sandbox Code Playgroud)
在sudo /bin/bash -c echo foo没有提示输入密码的情况下执行工作.
但是,sudo /bin/bash -c "echo foo && echo bar"仍然要求输入密码.
我尝试了很多变化,但没有被接受.
哪里出错?/如何允许-c后跟多个命令?
我需要在foo_path中添加一个简单的更改,所以我这样做了:
module ApplicationHelper
# [...]
def foo_path(foo, options = {})
options.merge!(bar: foo.some_attribute)
super
end
# [...]
end
Run Code Online (Sandbox Code Playgroud)
现在,这在从视图调用时起作用,但是当从控制器调用时,使用没有添加的原始变体.
如何覆盖应用程序的相应帮助程序(_path/_url)?
在Grails 1.3.7中,我根据Burt在http://www.infoq.com/presentations/GORM-Performance中的建议花了很长时间来转换我的域类关系.
现在,Grails 2支持Hibernate的包,我正在考虑将我的更改恢复为hasMany/ belongsTo.
请注意,应用程序将在多年内看到长期改进(因此没有"部署即忘记":).
更新:一个主要问题是,如果我在应用程序上线后进行了更改,那么在数据库中手动更改会产生多少麻烦.目前尚未发布,所以在Go-Live之前它是合理的.
更新:答案
在2011年11月的博客文章" Grails 2.0中的Hibernate Bags "中,Burt Beckwith描述了Grails 2中的Bags问题并得出结论:
所以我想我已经回过头来提倡早先的谈话了.不要在Author类中映射Books集合,而是将Book字段添加到Book类中
所以答案是坚持使用转换后的(即非设置/ -list/-bag)变体.
请投票重新打开此帖子,以便以正确的方式回答和接受.
在Tomcat 7上使用Grails 2.0.0,我在启动时获得了以下权利:
2011-08-21 11:10:09,758 [main] ERROR StackTrace - Full Stack Trace:
java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:172)
at org.springframework.context.support.AbstractApplicationContext.containsBean(AbstractApplicationContext.java:1109)
at org.codehaus.groovy.grails.web.context.GrailsContextLoader$1.run(GrailsContextLoader.java:88)
at org.codehaus.groovy.grails.lifecycle.ShutdownOperations.runOperations(ShutdownOperations.java:62)
at org.codehaus.groovy.grails.web.context.GrailsContextLoader.closeWebApplicationContext(GrailsContextLoader.java:136)
at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:142)
at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4763)
at org.apache.catalina.core.StandardContext$4.run(StandardContext.java:5472)
at java.lang.Thread.run(Thread.java:619)
at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5481)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:153)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:812)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:787)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:607)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:633)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:558)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:468)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1322)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:379)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:324)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1041)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774) …Run Code Online (Sandbox Code Playgroud) 我想从相应格式的输入字符串生成谜语.
输入示例:
Foo was the +first+ to get a drink at +the bar+.
期望的输出:
Foo was the _____ to get a drink at ___ ___.
使用任何标准的shell工具,最简单的(在眼睛上)解决方案是什么?