渲染' new'导致不同的网址

时间:2017-04-06 17:57:15

标签: ruby-on-rails routing

在我的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

谢谢,

5 个答案:

答案 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'