在轨道布线中令人困惑



在偶然浏览了迈克尔·哈特尔教程后,我无法弄清楚为什么会发生这种情况。

当我单击提交表单并期望失败时,渲染后的预期 url 应该是"/signup",但有些原因是它是"/users"

这是我的控制器

  def new
    @user = User.new
  end
  def show
    @user = User.find(params[:id])
  end
  def create
    @user = User.new(params[:user])
    if @user.save
      redirect_to @user
    else
      render 'new'
  end

这是我的路线

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

首先,当我单击注册链接时,网址是

http://localhost:3000/signup

然后子传失败,这个网址是

http://localhost:3000/users

谁能解释我为什么会这样?谢谢

当您发布到 UsersController 时(从注册操作创建新用户),您将调用#create操作。如果您在该页面上查看源代码,您将看到表单操作/users,表单方法POST。因此,当您提交表单时,提出的请求是:

POST /users
(some data)

如果保存失败,那么您的创建操作只会呈现"新"模板。您不会被重定向到任何地方。 render :action => "new" 只是呈现new操作的模板 - 它实际上不会重定向到新操作或运行其操作代码。

根据 routes.rb 在 rails 中的用法,routes.rb 文件中match标签确定如果匹配,要到达哪个controller/action

因此,在这里,您的注册 URL 与user控制器> new操作匹配。但是,如果new操作失败,则 url 不是/signup,而是控制器user new函数。所以网址是这样显示的。希望我说得更清楚一些。

最新更新