在我的rails项目的用户表单中处理验证错误时,如果用户无效,我会收到render 'new'
指令。
但是,发生这种情况时,搜索栏中的网址会发生变化。
最初,它是https://localhost:3000/signup
,但当用户提交表单并发生render 'new'
时,网址会变为https://localhost:3000/users
为什么?
这是我的routes.rb
Rails.application.routes.draw do
# Resources
resources :users, only: [ :new, :create ]
# Application root
root 'static_pages#home'
# Static pages
get '/help', to: 'static_pages#help'
get '/contact', to: 'static_pages#contact'
# Users
get '/signup', to: 'users#new'
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
谢谢,
答案 0 :(得分:2)
在Rails REST约定中,您使用不同的URI来显示用于创建资源的表单以及POST到的表单action
属性。
让我们说:
resources :pets
这给了我们:
GET /pets/new => pets#new
POST /pets => pets#create
然后我们有一个典型的形式:
# posts to /pets
<%= form_for(@pet) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.submit %>
<% end %>
磨机控制器的运行:
class PetsController < ApplicationController
def new
@pet = Pet.new
end
def create
@pet = Pet.new(pet_params)
if @pet.save
redirect_to @pet
else
render :new
end
end
# ...
end
因此,当用户访问/pets/new
并填写表单时,如果表单无效,则浏览器网址应为/pets
。这是预期的行为 - 发布到不同的URL可以避免大量缓存和历史记录相关的问题。
从平静的角度来看,它也是正确的 - 您不再查看新操作 - 您正在查看尝试创建资源的结果。前者是幂等的 - 后者不是。
您需要认识到render :new
行是render template: 'pets/new'
的缩写。它不会重定向,也不会调用控制器中的new
操作。它只是渲染模板并将其作为对当前请求的响应返回。
答案 1 :(得分:1)
发生这种情况的原因是由于Rails处理路由的方式。最有可能的是,您的注册页面上的表单类似于:
<?= form_for @user do |f| ?>
如果查看生成的HTML,您会注意到该表单正在POST到网址'/users'
。因此,当提交注册表单时,应用程序会将您重定向到/users
。
这是Rails中的正常行为。 (见Rails Guides)
如果您希望网址看起来像/signup
,则可以为其添加命名路由:
# Users
get '/signup', to: 'lead_magnets#new'
post '/signup', to: 'lead_magnets#create'
然后在您的注册表单中,您需要明确引用新的注册路径:
<?= form_for @user, url: signup_path do |f| ?>
生成的HTML应该看起来像
<form class="new_user" id="new_user" action="/signup" method="post">
答案 2 :(得分:0)
您是否尝试包含识别路径?
Rails.application.routes.recognize_path
答案 3 :(得分:0)
这样做的原因是,当您提交表单时,您会将其提交到new
视图中的某些操作。表单提交的操作有一个路径,您可以通过键入以下内容来查看路径:
rake routes
在控制台中并搜索创建操作。如果您的验证在创建操作中失败,则会调用render 'new'
。
渲染模板时,正在渲染的页面的网址将是呈现模板的控制器操作的网址/路径。
在您的情况下,一旦您的模板呈现,您调用render 'new'
的行为将是确定网址的行为。
答案 4 :(得分:-1)
您需要添加
post '/signup', to: 'users#new'