提交表单时出错,Rails 4中呈现的URL会更改

Jas*_*ran 5 forms routes ruby-on-rails ruby-on-rails-4

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

注册表单位于以下网址:

http://localhost:3000/signup
Run Code Online (Sandbox Code Playgroud)

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

resources :users
match '/signup',  to: 'users#new', via: 'get'
Run Code Online (Sandbox Code Playgroud)

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

http://localhost:3000/users
Run Code Online (Sandbox Code Playgroud)

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

http://localhost:3000/signup
Run Code Online (Sandbox Code Playgroud)

这是我的控制器代码:

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
Run Code Online (Sandbox Code Playgroud)

这是我表格的开始标记:

<%= form_for @user, url: {action: "create"}  do |f| %>
Run Code Online (Sandbox Code Playgroud)

sol*_*333 5

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

在routes.rb中:

get 'signup', to: 'users#new'
post 'signup', to: 'users#create'
resources :users
Run Code Online (Sandbox Code Playgroud)

并在您的表单助手中:

<%= form_for @user, url: signup_path  do |f| %>
Run Code Online (Sandbox Code Playgroud)

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

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