2016-07-27 51 views
4

後,所以我有一個控制器的動作看起來像這樣:Rails的刷新頁面調用render上驗證失敗

def create 
    @term = Term.new(term_params) 
    if @term.save 
    redirect_to(@term) 
    else 
    render :new 
    end 
end 

驗證失敗時新的操作,可以查看被渲染和用戶可以看到所做的錯誤。問題是這也將URL更改爲localhost:3000/terms,所以當用戶因爲某種原因想要刷新頁面時,那麼rails會希望將該用戶重定向到術語index頁面。刷新後有沒有簡單的方法讓用戶登錄new term頁面?

我其實並沒有index頁面terms因爲我不需要它,所以這種情況在這種情況下會引發錯誤。

+0

如果您不想更改驗證失敗的網址。通過ajax處理創建操作。如果你將'渲染'它將只顯示創建網址。 –

回答

0

其實有一個修復。將route.rb文件中的resources設置爲resource。這不會創建索引操作,除非你明確地提出要求,如:

resources :posts, :only => [:index, :create, :show] 

否則,如果你這樣做在routes.rb文件時,它不會產生指標作用:

resources :posts 

我希望這有助於。

+0

我確實需要強硬的身份證。這會失去參數。 – Kaspar

+0

不,它不會。重定向將在參數 –

+0

中放置參數。現在,它將要呈現show操作視圖。這也不是更好:D – Kaspar

2

請,藉此考慮:

你看到terms,但不是像「項指數」一樣。事情是,使用https,在你的「新」行動的路徑。索引使用「get」並創建使用「post」。所以,看起來相同但不是。

我覺得在你的路線文件中,你需要用explict的方式定義「post」路徑。

post "new-term" => terms#new 

,也許在你的控制器定義了:

render new_term_path 
+0

感覺有點駭人聽聞:/ – Kaspar

+0

總之: 索引操作,使用Https「get」方法。該方法將獲取所有數據。創建操作使用Https「post」方法。重要的是你注意到了不同之處。您可能會在網址中看到相同的內容,但不是。 然後,你只需要實現我上面提到的方法。我認爲你甚至可以這樣做:「redirect_to new_term_path」,不要傳遞@term對象,因爲沒有創建。 我認爲你使用這個:redirect_to new_term_path當刷新頁面時你不會再看到錯誤消息,因爲現在調用正在重新調用full_path而不僅僅是模板 –

2

認識到,當你做render :newcreate動作裏面,你實際上並不路由到和運行new作用是很重要的,你只需簡單地渲染新的模板(即new.html.erb),以便URL反映創建操作的URL(在您的案例中爲/terms)。

如果您想實際將您的用戶路由到/terms/new,那麼如果保存失敗,您可以redirect_to new_term_path,儘管這也會阻止用戶看到驗證錯誤。

既然你提到,你實際上並沒有使用index動作來呈現任何有意義的事,有如果用戶恰好刷新頁面它執行重定向

def index 
    redirect_to new_term_path 
end 

這樣一來,他們將被重定向回到新形式。這不是一個通用的解決方案,但應該適合您的具體情況。