【问题标题】:Rails console shows view is rendered, but doesn't render in browserRails 控制台显示视图已呈现,但未在浏览器中呈现
【发布时间】:2014-12-13 00:58:51
【问题描述】:

这看起来很奇怪。我有一个链接,我想对控制器进行 ajax 调用以删除用户的响应,然后重定向到另一个页面。这是链接的代码:

<%= link_to 'try again', reset_score_path, remote: true, controller: "pages", 
action: "reset_score", class: "btn btn-primary tryAgain", data: { confirm: 'This 
will reset your score to <strong>zero</strong> and reset all of your answers so you 
can start fresh. Do you want to continue?', commit: "Restart", cancel: "No Thanks",
focus: 'none'}, title: "Try Again?" %>

这是控制器动作:

def reset_score
  current_user.responses.destroy_all
  current_user.certificate.destroy
  redirect_to action: "course_page1", format: "html" and return
end

但问题是浏览器中什么也没有发生;它不会重定向。但是控制台显示它正在处理和渲染视图。查看控制台输出:

Started GET "/pages/reset_score" for 127.0.0.1 at 2014-10-17 07:19:45 -0500
Processing by PagesController#reset_score as JS
User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 62 ORDER BY "users"."id" ASC LIMIT 1
Response Load (0.3ms)  SELECT "responses".* FROM "responses" WHERE "responses"."user_id" = ?   [["user_id", 62]]
[AWS S3 404 0.306706 0 retries]  head_object(:bucket_name=>"...",:key=>"x.pdf") AWS::S3::Errors::NoSuchKey No Such Key

Redirected to http://localhost:3000/pages/course_page1.html
Completed 302 Found in 315ms (ActiveRecord: 0.6ms)

Started GET "/pages/course_page1.html" for 127.0.0.1 at 2014-10-17 07:19:45 -0500
Processing by PagesController#course_page1 as HTML
User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 62 ORDER BY "users"."id" ASC    LIMIT 1
Rendered pages/course_page1.html.erb within layouts/application (0.3ms)
Rendered layouts/_header.html.erb (0.4ms)
Completed 200 OK in 80ms (Views: 78.5ms | ActiveRecord: 0.2ms)

所以它似乎表明视图已呈现。然而,浏览器实际上并没有显示这个视图——它只是停留在前一页上。

有什么想法吗?我被难住了!

(是的,我知道 AWS 给出了一个错误,但我假设它与这个问题无关?)

编辑: 感谢 Pamio 的回答,这是控制器的解决方案代码(替换上面的第 4 行):

def reset_score
    current_user.responses.destroy_all
    current_user.certificate.destroy

    respond_to do |format|
        format.js { render :js => "window.location.href = '#{pages_course_page1_path}'" }
    end
end

【问题讨论】:

    标签: javascript ruby-on-rails ajax model-view-controller


    【解决方案1】:

    您使用了redirect_to action: "course_page1", format: "html" and return,这是不对的。如果它是一个 html 请求而不是 ajax,那么重定向将可以正常工作。所以如果你想重定向尽管请求是一个ajax,使用可能是这样的

    format.js { render :js =&gt; "window.location.href = '#{course_page_path}'" }

    或者从链接中删除remote: true 属性,这样它就可以正常工作了。

    希望有帮助

    【讨论】:

    • 很高兴它有帮助。但最重要的是,请问为什么要在 ajax 请求中重定向?虽然您可以使用简单的表格。我想知道发生这种事情的用例:)
    【解决方案2】:

    当然,因为您使用的是 ajax,而不是标准调用。如果您想被重定向,请尝试从link_to 中删除remote: true。或者如果你想继续使用 ajax,你需要通过 jQuery 从 js 文件做重定向。在您的示例中,它应该位于reset_score.js.erb

    【讨论】:

    • “从js文件重定向jQuery”怎么办?
    • var url = '&lt;%= course_page_path %&gt;'; window.location.href = url; course_page_path 取决于你想要重定向到哪里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多