2014-02-28 74 views
1

我有一個PagesController在那裏我創造這樣一個新的紀錄:Rails的兩次

def new 
    @page = Page.create(status: "draft", title: "Temporary title") 
    end 

我使用Page.create因爲用戶應該能夠立即向add page_items到新的一頁,該協會需要一個帶有ID的記錄。

問題是,無論何時點擊「新記錄」,我都會創建兩條新記錄。不只是一個。

編輯:該問題似乎與Turbolinks有關。如果我使用正常的「新頁面」鏈接,則向服務器發出兩個請求,因此會創建兩個頁面。如果我手動訪問鏈接或在新標籤中打開鏈接,我會得到一條記錄。

這個問題是整個應用程序。所有鏈接都會向服務器創建兩個獲取請求。

編輯2:這裏是當我點擊「新的一頁」鏈接的服務器響應:

Started GET "/pages/new" for 127.0.0.1 at 2014-02-28 22:39:41 +0100 
Processing by PagesController#new as HTML 
    User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."auth_token" = '040__V_8SbdLhYxbjd1sYQ' LIMIT 1 
    User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."subdomain" = 'ohenrik' LIMIT 1 
    Page Load (0.3ms) SELECT "pages".* FROM "pages" WHERE "pages"."id" IN (3) 
    (0.1ms) BEGIN 
    SQL (0.4ms) INSERT INTO "pages" ("created_at", "status", "title", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["created_at", Fri, 28 Feb 2014 21:39:41 UTC +00:00], ["status", "draft"], ["title", "Temporary title"], ["updated_at", Fri, 28 Feb 2014 21:39:41 UTC +00:00]] 
    (1.1ms) COMMIT 
    Rendered shared/_form_errors.html.erb (0.0ms) 
    Rendered pages/_rich_link_button.erb (0.0ms) 
    Rendered pages/_rich_content_toolbar.erb (0.6ms) 
    Rendered pages/_rich_link_button.erb (0.0ms) 
    Rendered pages/_rich_excerpt_toolbar.erb (0.5ms) 
    PageItem Load (0.3ms) SELECT "page_items".* FROM "page_items" WHERE "page_items"."page_id" = $1 ORDER BY (case when page_items.ancestry is null then 0 else 1 end), page_items.ancestry, position [["page_id", 55]] 
    Rendered pages/_form.html.erb (5.6ms) 
    Rendered pages/new.html.erb within layouts/application (6.1ms) 
    Rendered shared/_navigation.html.erb (27.0ms) 
    Rendered shared/_notice.html.erb (0.1ms) 
Completed 200 OK in 53ms (Views: 46.6ms | ActiveRecord: 3.4ms) 


Started GET "/pages/new" for 127.0.0.1 at 2014-02-28 22:39:42 +0100 
Processing by PagesController#new as HTML 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."auth_token" = '040__V_8SbdLhYxbjd1sYQ' LIMIT 1 
    User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."subdomain" = 'ohenrik' LIMIT 1 
    Page Load (0.3ms) SELECT "pages".* FROM "pages" WHERE "pages"."id" IN (3) 
    (0.1ms) BEGIN 
    SQL (0.4ms) INSERT INTO "pages" ("created_at", "status", "title", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["created_at", Fri, 28 Feb 2014 21:39:42 UTC +00:00], ["status", "draft"], ["title", "Temporary title"], ["updated_at", Fri, 28 Feb 2014 21:39:42 UTC +00:00]] 
    (0.3ms) COMMIT 
    Rendered shared/_form_errors.html.erb (0.1ms) 
    Rendered pages/_rich_link_button.erb (0.0ms) 
    Rendered pages/_rich_content_toolbar.erb (0.6ms) 
    Rendered pages/_rich_link_button.erb (0.0ms) 
    Rendered pages/_rich_excerpt_toolbar.erb (0.4ms) 
    PageItem Load (0.3ms) SELECT "page_items".* FROM "page_items" WHERE "page_items"."page_id" = $1 ORDER BY (case when page_items.ancestry is null then 0 else 1 end), page_items.ancestry, position [["page_id", 56]] 
    Rendered pages/_form.html.erb (4.9ms) 
    Rendered pages/new.html.erb within layouts/application (5.3ms) 
    Rendered shared/_navigation.html.erb (41.1ms) 
    Rendered shared/_notice.html.erb (0.1ms) 
Completed 200 OK in 66ms (Views: 60.5ms | ActiveRecord: 2.6ms) 

注意,刪除了一些額外的不必要的代碼,使問題更加清晰。這個問題與jquery已經包含的額外的jquery插件有關。這導致遠程鏈接(也是turbolink)被激發兩次。我的答案波紋管

任何暗示或答案可能是錯誤的讚賞! :)

+0

我在這裏沒有看到任何東西會創建兩個記錄。您是否有任何回調,過濾器或其他可能在您執行創建操作時運行的代碼? –

+0

不,我沒有額外的回調,除了一個驗證。並刪除沒有幫助。 –

+0

但是我現在注意到,如果我手動訪問locallhost:3000/pages/new鏈接,只創建一條記錄,同樣如果我在新選項卡中打開記錄。只有當我按照「新頁面」鏈接發生錯誤。那麼這可能與turbolinks有關? –

回答

0

使用find_or_create_*方法而不是create

def new 
    @page = Page.find_or_create_by_status_and_title("draft","Temporary title") 
end 

唯一可能的原因是您的控制器可能會收到兩個不同的請求。可能會出現一些客戶端錯誤,如javascript正在重新載入所有頁面,或者用戶多次單擊該按鈕。您可以檢查日誌並確認。

Read More here

+0

呵呵,漂亮的黑客。它最初解決了這個問題,但它仍然不是一個完整的解決方案。問題在於用戶在重命名舊的默認標題之前將無法創建新頁面。你說得對,要求是兩次。我認爲這是由turbolinks造成的。有關如何解決這個問題的任何想法? –

+0

以上將修復它。您也可以點擊「在這裏閱讀更多」。 –

+0

上述答案似乎解決了這個問題,但它實際上只是消除了症狀(症狀是兩條記錄而不是一條記錄)。問題(我相信)與turbolinks發送兩個請求有關,而不是當我點擊「新頁面」 –