重定向到表单验证错误的路由别名

时间:2010-05-07 12:06:52

标签: ruby-on-rails cucumber

如果我在某个路由别名上,例如/ register,我有一个表单错误而且我渲染:new,路径是否可以/注册?

目前正在渲染/新

我可以执行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 "kevin@acme.com"
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."

5 个答案:

答案 0 :(得分:1)

Rails方法是再次呈现“新”(即寄存器)操作,因为您已经创建了对象,该表单将包含先前输入的值以及错误消息。如果重定向,则必须在执行重定向之前将对象保存在会话或数据库中。如果偏离惯例,那么确保你这样做是有好处的。

答案 1 :(得分:1)

从动作调用渲染将意味着URL将保持不变,无论是GET还是POST。 URL为/ new的原因是因为'Register'必须POST到/ new。如果您希望此功能通过,您应该将“然后我应该在注册页面上”更改为“然后我应该在新注册页面上”并在我看来写下相应的网页步骤。

答案 2 :(得分:1)

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

这可能如下所示:

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

答案 3 :(得分: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

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

答案 4 :(得分:0)

实际上,这看起来像测试中的一行修复。 (为什么你更喜欢在/注册页面?)。

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