【问题标题】:redirect to a route alias on a form validation error在表单验证错误时重定向到路由别名
【发布时间】:2010-05-07 12:06:51
【问题描述】:

如果我在 /register 之类的路由别名上并且出现表单错误并呈现 :new,那么路径是否可能仍然是 /register?

目前正在渲染/new

我可以做一个 redirect_to register_path 但我会丢失参数?

它使以下​​测试失败:

  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."

【问题讨论】:

  • 我问了一个类似的问题,得到了答案,见stackoverflow.com/questions/1083798/…
  • 为了乔布斯的爱,请纠正最后一句的语法。您不希望您的网站出现在 Error'd 上。 “您的员工 ID 号看起来不正确。”
  • 哦,是的!好点子。你的权利!

标签: ruby-on-rails cucumber


【解决方案1】:

另一种方法是设置两个“注册”路由。一个只接受 GET 请求(并进入 :new 操作),另一个只接受 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

【讨论】:

  • 嗨,Taryn,这正是我最后所做的。感谢您的回答。凯文。
【解决方案2】:

Rails 方式是再次渲染“新”(即注册)动作,因为您已经创建了对象,表单将包含先前输入的值以及错误消息。如果您重定向,则必须在执行重定向之前将对象保存在会话或数据库中。与惯例背道而驰时,确保您这样做是有充分理由的总是好的。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      这将实现您的要求。此外,人们将能够使用“错误”URL 并仍然转到有效页面。也就是说,即使出现错误,他们也可以复制/粘贴 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
      

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

      【讨论】:

        【解决方案5】:

        真的,这看起来像是测试中的单行修复。 (为什么你更喜欢在 /register 页面上?)。

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

        【讨论】:

          猜你喜欢
          • 2022-11-09
          • 2013-03-24
          • 2018-05-04
          • 1970-01-01
          • 1970-01-01
          • 2016-09-01
          • 1970-01-01
          • 2017-10-11
          • 2019-03-12
          相关资源
          最近更新 更多