我创建了一个新的Rails项目。毕竟,我有一个我无法在任何地方找到的问题或自己回答,所以我需要你的帮助。
创建新对象(如人物,书籍)时,您需要执行两项操作:NEW
和CREATE
。
当我创建新内容时,我有链接:localhost:3000/admin/books/new
然后当我创建失败时,它将返回ERROR MESSAGE
和此链接:localhost:3000/admin/books/create
If I click in url and `ENTER`. It will wrong.
如果创建失败,我尝试使用redirect_to
或render
。但没有任何反应,有时它会转到new
页面,但它不会显示错误消息。
我认为Rails是一个规则。 But I still want to ask that anyone have any idea to resolve this problem??? Go to
新link with
错误消息if they're failed
更多细节:我使用Typus gem为admin创建视图。所以我无法找到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 :(得分: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
因此,您在重定向时无法访问错误的menagens。只有你可以进行重定向,正在设置一条flash消息:
if @book.save
redirect_to @book
else
flash[:error] = "An error occurred while saving Book."
redirect_to :new
end
将会解决这两个问题的资源:
答案 1 :(得分: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
答案 2 :(得分: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