小编use*_*825的帖子

如何在AJAX中优雅地处理设计401的状态?

随着色器件一个使用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状态代码.

我如何优雅地处理这种情况并在覆盖重定向中显示登录对话框,因为非远程变体会这样做?

设计是否为我需要激活的情况提供默认策略?

authentication ajax ruby-on-rails devise

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

具有不同HTTP请求类型的两条路由如何共享相同的名称?

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中生成路由?

ruby routes ruby-on-rails ruby-on-rails-4

17
推荐指数
2
解决办法
4902
查看次数

如何测试使用条件查询的Grails服务(使用spock)?

我正在尝试测试一种简单的服务方法.该方法主要只返回一个条件查询的结果,如果它返回一个结果,我想测试它(取决于查询的内容).

问题是,我不知道如何正确地对应相应的测试.我试图通过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)

grails junit unit-testing hibernate spock

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

如何正确地将grails单元测试助手方法移动到单独的文件中?

我有一些经常使用的帮助方法,用于将单元测试放入单独的文件中.例如,我的想法是允许我的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)

grails groovy unit-testing dry helpers

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

如何允许bash -c为sudoers(后跟多个命令)?

我在/ 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后跟多个命令?

bash sudo sudoers

7
推荐指数
2
解决办法
2067
查看次数

如何全局覆盖rails url helper?

我需要在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)?

ruby-on-rails

7
推荐指数
3
解决办法
4992
查看次数

我应该将我的Grails域关系转换为使用Hibernate Bags吗?

Grails 1.3.7中,我根据Burt在http://www.infoq.com/presentations/GORM-Performance中的建议花了很长时间来转换我的域类关系.

现在,Grails 2支持Hibernate的包,我正在考虑将我的更改恢复为hasMany/ belongsTo.

  1. 我会选择哪种方式更具未来性?
  2. 如果我坚持手动/显式实现可能会出现哪些问题?
  3. 如果我换成手袋可能会出现哪些问题?
  4. 两种变体相比,是否有任何优势?

请注意,应用程序将在多年内看到长期改进(因此没有"部署即忘记":).

更新:一个主要问题是,如果我在应用程序上线后进行更改,那么在数据库中手动更改会产生多少麻烦.目前尚未发布,所以在Go-Live之前它是合理的.

更新:答案

在2011年11月的博客文章" Grails 2.0中Hibernate Bags "中,Burt Beckwith描述了Grails 2中的Bags问题并得出结论:

所以我想我已经回过头来提倡早先的谈话了.不要在Author类中映射Books集合,而是将Book字段添加到Book类中

所以答案是坚持使用转换后的(即非设置/ -list/-bag)变体.

请投票重新打开此帖子,以便以正确的方式回答和接受.

grails persistence hibernate grails-orm grails-domain-class

6
推荐指数
0
解决办法
537
查看次数

我怎样才能应对"IllegalStateException:BeanFactory未初始化或已经关闭"?

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

java grails groovy tomcat tomcat7

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

如何非贪婪地替换一行的多个分隔字符串?

我想从相应格式的输入字符串生成谜语.

输入示例: Foo was the +first+ to get a drink at +the bar+.

期望的输出: Foo was the _____ to get a drink at ___ ___.

使用任何标准的shell工具,最简单的(在眼睛上)解决方案是什么?

awk grep sed

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