2017-04-06 77 views
0

當我在我的rails項目上處理用戶表單中的驗證錯誤時,如果用戶無效,我有指令render 'new'呈現'新'導致不同的網址

但是,當發生這種情況時,搜索欄中的網址會發生變化。

原來,這是https://localhost:3000/signup但是當用戶提交表單和render 'new'發生時,URL成爲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 

感謝,

回答

-1

您需要添加

post '/signup', to: 'users#new' 
+0

雖然這確實解決了直接的問題,但它帶來了一些歷史相關的問題,而軌道約定旨在避免這些問題。在破解規則之前瞭解規則。 – max

0

你嘗試包括認識路?

Rails.application.routes.recognize_path 
1

出現這種情況的原因是因爲Rails的處理路線的方式。最有可能的,你的註冊頁面上的表格有一樣的東西:

<?= form_for @user do |f| ?> 

如果你看一下生成的HTML你會發現,形式張貼到URL '/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"> 
0

原因是因爲當您提交表單時,您是從new視圖中將其提交給某個操作。該表單提交到該動作有一個路徑,你可以看到的路徑是通過打字什麼:

rake routes 
在控制檯

並搜索創建行動。如果在創建操作中驗證失敗,請致電render 'new'

當您渲染模板時,正在渲染的頁面的url將是呈現模板的控制器操作的url /路徑。

就你的情況而言,無論你有什麼動作render 'new'將成爲你的模板渲染後決定url的行爲。

2

在Rails REST約定中,您使用不同的URI來顯示錶單以創建資源,並使用您要發佈的表單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並填寫表單時,如果表單無效,則瀏覽器url應該讀取/pets。這是預期的行爲 - 發佈到不同的URL避免了無數的緩存和歷史相關的問題。

從寧靜的角度來看,它也正確 - 您不再查看新的操作 - 您正在查看嘗試創建資源的結果。前者是冪等的 - 後者不是。

您需要認識到行render :newrender template: 'pets/new'的縮寫。它不重定向,它不會調用控制器中的new操作。它只是呈現模板並將其作爲對當前請求的響應返回。

相關問題