2010-05-07 92 views
5

如果我在一个路由别名,如/ register,我有一个表单错误,我渲染:新,有可能是/注册路径仍然可以?重定向到表单上的路由别名验证错误

在它呈现的那一刻/新

我可以做一个redirect_to的register_path但随后我就失去了PARAMS?

它让下面的测试失败:

Scenario: Try registering with a bad staff number 
Given I am on the registration page 
When I fill in "email" with "[email protected]" 
And I fill in "First Name" with "Kevin" 
And I fill in "last name" with "Monk" 
And I fill in "Employee Number" with "something barking123" 
And I press "Register" 
Then I should be on the registration page 
And I should see "Your employee ID number looks incorrect." 
+1

我问过类似的问题并得到答案,请参阅http:// stackoverflow。com/questions/1083798/use-custom-route-model-validation-failure – 2010-05-07 14:18:46

+0

为了爱上乔布斯,请纠正最后一句中的语法。您不希望您的网站出现在Error'd上。 “您的员工ID号码看起来不正确。” – mcandre 2010-05-25 16:50:31

+0

哦,是啊!好点子。你的权利! – 2010-05-26 18:04:34

回答

1

另一种方法是设置两个“注册”路线。一个只接受GET请求(并转到:new动作),另一个只接受POST请求(并转到create动作,但呈现与新的相同的模板)。

这可能是这样的:

map.get_register 'register', :controller => :registrations, 
       :action => :new, :conditions => { :method => :get } 
map.post_register 'register', :controller => :registrations, 
       :action => :create, :conditions => { :method => :post } 

然后在你的控制器:

def new 
    @registration = Registration.new 
    # renders the 'registrations/new' template 
end 
def create 
    @registration = Registration.new(params[:registration]) 

    # render the 'registrations/new' template if we fail validation 
    return render(:action => :new) unless @registration.save 
    # otherwise renders the "create" template which is likely a thank-you 
end 

似乎有更多类似的静脉在这个问题上: Use custom route upon model validation failure

+0

嗨Taryn, 这正是我到底做了什么。 感谢您的回答。 Kevin。 – 2010-08-26 10:42:46

1

Rails的办法就是再次渲染“新”(即注册)行动开展以来,已创建的对象,形式将包含以前输入的值以及错误消息。如果重定向,则必须在重定向之前将对象保存在会话或数据库中。当与常规背道而驰时,确保您有足够的理由这样做总是很好的。

1

从动作调用呈现将意味着URL将保持不变,无论是GET或POST。网址为/新的原因是因为'注册'必须在POST之后/新。如果你想要这个功能通过,你应该改变“那么我应该在注册页面”为“那么我应该在新的注册页面”并写出相应的网页步骤,在我看来。

0

如果你真的想要这个,那么你可以将你的'创建'动作合并到'新'动作中,并将'更新'动作合并到'编辑'动作中。然后你需要检查请求类型并相应地处理它。

这将实现你所要求的。此外,人们可以使用“错误”URL并仍然转到有效页面。也就是说,即使遇到错误,他们也可以复制/粘贴网址,并且会有一个有效的GET页面。

这就是说,这是一个主要的黑客攻击,而不是我推荐你做的事情。你必须做很多工作,而且好处很小。

编辑:例如..

def new 
    if request.get? 
    @user = User.new 

    elsif request.post? 
    @user = User.new(params[:user]) 
    if @user.save 
     redirect_to users_path 
    else 
     render :new 
    end 
    end 
end 

还就需要添加自定义路线。

0

真的,这看起来像是测试中的一条线。 (为什么你更喜欢登录/注册页面?)。

如果它真的很重要,你也可以暂时在会话变量中存储参数。