Rails中的URL create和new

时间:2016-01-22 03:51:16

标签: ruby-on-rails

我创建了一个新的Rails项目。毕竟,我有一个我无法在任何地方找到的问题或自己回答,所以我需要你的帮助。

创建新对象(如人物,书籍)时,您需要执行两项操作:NEWCREATE

当我创建新内容时,我有链接:localhost:3000/admin/books/new

然后当我创建失败时,它将返回ERROR MESSAGE和此链接: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为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

感谢您的帮助:)。

3 个答案:

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