【问题标题】:When the form is submitted with an error, the rendered url changes in Rails 4当表单提交错误时,Rails 4 中呈现的 url 会发生变化
【发布时间】:2014-07-02 20:14:05
【问题描述】:

我创建了一个用户注册页面。当用户错误提交表单时,当显示验证错误时,它不会呈现在同一个 URL 上。

注册表单位于此网址:

http://localhost:3000/signup

我为注册页面添加了以下路由:

resources :users
match '/signup',  to: 'users#new', via: 'get'

当我提交表单时,模型验证显示,但 url 重定向到:

http://localhost:3000/users

我希望用户在提交表单后保持相同的 url。

http://localhost:3000/signup

这是我的控制器代码:

def new
    @user = User.new
  end

  def create

    @user = User.new(user_params) # Not the final implementation!

    if @user.save
      # Handle a successful save.
    else
        render 'new'
    end
  end

这是我的表单的开始标签:

<%= form_for @user, url: {action: "create"}  do |f| %>

【问题讨论】:

  • `匹配'/signup',到:'users#update',通过:'put',如:'signup'`
  • 匹配 '/signup',到:'users#new',通过:'get',如:'signup' 不起作用:(
  • get 'signup' =&gt; 'users#new', as: :signup put 'signup' =&gt; 'users#update', as: :signup 尝试将这些添加到您的路线并删除旧的。
  • 现在正在工作.. 我在 4.0 工作
  • 你不能在 Rails 4 中使用match。你解决了这个问题还是需要帮助?

标签: ruby-on-rails forms ruby-on-rails-4 routes


【解决方案1】:

我正在使用 Rails 5,但我怀疑它在概念上并没有太大的不同。

在 routes.rb 中:

get 'signup', to: 'users#new'
post 'signup', to: 'users#create'
resources :users

在你的表单助手中:

<%= form_for @user, url: signup_path  do |f| %>

本质上,它无法按照原始帖子中的描述工作的原因是,当表单发布 (rails 4.2 form helpers) 时,它与url: {action: "create"} 绑定,默认情况下,根据为resources :users 自动生成的路由, 是post '/users', to: 'users#create (rails 4.2 routing guide)。并且通过在 routes.rb 中自上而下搜索,它会首先看到这个,你最终会得到 http://localhost:3000/users

因此,我建议的更改应该将表单绑定到注册路径,而不是在 routes.rb 中被视为第二个路由条目。

【讨论】:

    【解决方案2】:

    我相信@Jaskaran 的问题是关于 Michael Hartle 的 Ruby on Rails 教程底部的问题 2,section 7.3.3,所以我将参考这个问题来回答:

    1. 未提交的注册表单(图 7.12)上的 URL 与已提交注册表单的 URL(图 7.18)相比如何?为什么不匹配?

    要回答这个问题,我们需要了解路由在 Rails 应用程序中的工作原理。让我们来看看当您访问每个页面并提交时会发生什么。

    您的主页 (home.html.erb) 包含指向您的注册页面 (new.html.erb) 的链接。该链接如下所示:

    <%= link_to "Sign up now!", signup_path, class: "btn btn-lg btn-primary" %>
    

    signup_path 是我们最感兴趣的部分。signup_pathroute helper,它本质上是告诉 Rails,当有人点击该链接时,Rails 的行为就像他们刚刚访问了您的 /signup 页面一样.这就是您看到的第一个 URL(在提交表单之前)显示 http://localhost:3000/signup 的原因。

    现在让我们看看提交表单时会发生什么。根据new.html.erb 文件,该表单包含在此 Ruby 代码中:

    <%= form_for(@user) do |f| %>
    . . .
    <% end %>
    

    您可能还记得7.2.2 中的 Ruby 代码实际上在 HTML 中呈现为:

    <form class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post">
    . . .
    </form>
    

    也就是说,当提交表单时,它会向/users 发出 POST 请求 - 这就是您在浏览器中看到的 URL。

    如果我们先停下来想一想,我们就能更好地理解为什么会这样——/users 路由到哪里?您可以通过在控制台中输入bundle exec rake routes 来快速检查您的路线。您应该会在此处看到它:

    Prefix Verb   URI Pattern               Controller#Action
    users  GET    /users(.:format)          users#index
           POST   /users(.:format)          users#create
    

    因此,任何对/users 的 POST 请求都将被路由到我们的users_controller.rbcreate 方法。如果您想知道为什么会这样,那是因为我们在 routes.rb 文件中添加了这一行:

    resources :users
    

    有关该行的更多详细信息可以找到here

    【讨论】:

      猜你喜欢
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多