2014-02-28 99 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发送两个请求有关,而不是当我点击“新页面” –