2016-01-22 84 views
1

我創建了一個新的Rails項目。畢竟,我有一個問題,我找不到任何地方或自己回答,所以我需要你的幫助。在Rails中創建URL和新建

當您創建新對象(如Person,Book)時,您需要2個操作:NEWCREATE

當我創造新的,我有鏈接:localhost:3000/admin/books/new

,然後當我創建失敗,將返回ERROR MESSAGE ANF此鏈接:localhost:3000/admin/books/create

If I click in url and `ENTER`. It will wrong. 

我試圖使用redirect_torender如果創作失敗。但沒有任何事情發生,有時會轉到new頁面,但它不顯示錯誤消息。

我認爲是Rails中的一條規則。 But I still want to ask that anyone have any idea to resolve this problem??? Go tolink with錯誤消息if they're failed

更多詳細信息:我正在使用Typus gem爲管理員創建視圖。所以我找不到Routes文件。我跑rake routes,並得到:

GET /admin/books/(:/action(/:id)) (.:format) 
POST /admin/books/(:/action(/:id)) (.:format) 
PATCH /admin/books/(:/action(/:id)) (.:format) 
DELETE /admin/books/(:/action(/:id)) (.:format) 

和控制器時創建的書:

if result 
    format.html { redirect_on_success } 
    format.json { render json: @item } 
else 
    format.html { render :new, status: :unprocessable_entity } 
    format.json { render json: @item.errors, status: :unprocessable_entity } 
end 

感謝您的幫助:)

+0

你能表現你對這些模型的具體路線?我想你沒有使用RESTful。 – 2016-01-22 03:59:25

+0

告訴我們你的路線和控制器中有什麼 –

+0

我使用TYPUS gem for admin創建新書。所以我找不到路線。 –

回答

1

這是Rails的作品的正常方式。要了解正在發生的事情,您需要了解什麼是HTTP動詞以及它們是如何工作的。

當您訪問http://localhost:3000/book/new時,您向服務器發出請求以獲取(GET Verb)一些信息。在這種情況下,一個表單提交一個新的書。

當您單擊提交時,您正在發送(POST動詞)數據到服務器。在Rails上,鏈接http://localhost:3000/book/create僅適用於POST請求。這就是爲什麼當你直接訪問這個鏈接時,它說沒有找到路線。

這條線:

# ... 
else 
    format.html { render :new, status: :unprocessable_entity 
end 

意味着,如果一些錯誤發生,它需要再次渲染的新動作視圖,而不重定向。通過這種方式,您可以在要保存的對象上找到錯誤。

如果重定向,則會丟失實際(在創建階段)對象。沒有數據和錯誤的新對象將在new行動創建:

def new 
    @book = Book.new 
end 

出於這個原因,你將無法在重定向到訪問錯誤mensagens。只有你可以重定向做,樹立了一個閃光消息:

if @book.save 
    redirect_to @book 
else 
    flash[:error] = "An error occurred while saving Book." 
    redirect_to :new 
end 

2資源,這將HEP你的是:

+0

我明白你的解釋。但是我需要一個來自模型驗證的錯誤消息(不是控制器)。而且我知道這是Rails的工作方式,但我仍然希望找到適合這種情況的方法。無論如何,感謝您的幫助:) –

+1

我不知道它是否是正確的解決方案......但我認爲,一個可以工作的解決方案是傳遞一個變量閃爍與對象的錯誤消息。像:'閃光[:錯誤] = @ book.errors' – psantos

+0

在這裏我使用format.html。所以我很難使用你的解決方案。 我試圖用閃光燈和redirect_to,我得到消息'你正在重定向。'(不顯示頁面) 然後我試着用閃光燈和渲染,我得到了消息'#'(顯示頁面)。 他們兩個仍然顯示這個鏈接'localhost:3000/admin/books/create' :) –

1

在你耙路線,您可能會注意到它的前綴爲admin

GET /admin/books/(:/action(/:id)) (.:format) 
POST /admin/books/(:/action(/:id)) (.:format) 
PATCH /admin/books/(:/action(/:id)) (.:format) 
DELETE /admin/books/(:/action(/:id)) (.:format) 

您是否嘗試過使用前綴admin/books/new?和admin/books/create?然後注意你的網址:你只使用book,因爲你的路線是books

嘗試:

http://localhost:3000/admin/books/new

http://localhost:3000/admin/books/create

+0

我認爲你誤解我的問題是因爲我的粗心大意。對於那個很抱歉。 (我會再次編輯)。 –

0

你不應該得到這個錯誤,沒有(默認)沒有/create路徑,尤其是與GET動詞。

雖然你可以創建自己/create路徑,你的功能conventional

#config/routes.rb 
scope :admin do 
    resources :books, :people, only: [:new, :create] #-> url.com/admin/books/new 
end 

#app/controllers/books_controller.rb 
class BooksController < ApplicationController 
    respond_to :json, :html, only: :create #-> needs responders gem 
    def new 
     @book = Book.new 
    end 

    def create 
     @book = Book.new book_params 
     respond_with @book if @book.save 
    end 
end 

以上是標準化的(工作)的方式來實現你想要的。

-

按照該routes,沒有/create路徑:

POST /photos photos#create create a new photo 
+0

問題是我正在使用Typus。它爲我自動創建路線,所以我無法處理。所以我只想修復它在控制器(只是我的想法)。你有什麼想法,因爲我無法修復路線? –

+0

好的,知道這件事會有幫助,你願意我刪除答案嗎? –