【问题标题】:Rails render not refrshing the pageRails 渲染不刷新页面
【发布时间】:2013-08-27 18:04:42
【问题描述】:

我正在开发 ROR 应用程序。应用视图包含 ajax 和 jquery 代码:

jQuery.ajax({
  data:     'val=' + val,
  dataType: 'script',
  type:     'post',
  url:      "/portfolio/update"
});

更新操作包含以下代码:

def update
  j = params[:val]

  # Buisness logic code
  redirect_to root_url, notice: "update done"
end

当前视图和根 url 相同 - 投资组合/显示 现在视图上的按钮(仅 root_url)正在执行业务逻辑,但页面没有刷新,而视图上的其他简单表单按钮正在执行此操作。按下按钮后,我在 Rails 服务器中得到了这个:

Rendered portfolio/show.erb (1.5ms)
Completed 200 OK in 24ms (Views: 4.1ms)

任何猜测,但页面本身并不刷新。

【问题讨论】:

    标签: jquery ruby-on-rails ruby ajax ruby-on-rails-3


    【解决方案1】:

    Ajax 用于提供不需要刷新页面的功能。如果你想刷新页面,那么你应该使用html表单和提交按钮。

      <%= form_for %>
       .....
      <% submit %>
    

    或使用 Ajax,您需要在成功回调时手动执行,

    像这样,

    $.ajax({
    
     success: function(){
      window.location.reload();
     }
    );
    

    【讨论】:

    • 基本上使用 ajax 我正在调用我的操作来更新我的数据库,然后我必须刷新我的页面以在同一页面上显示更新的数据。我是从ajax开始的,你能详细说明一下吗?
    • 应该是window.location.reload()
    【解决方案2】:

    无需猜测。您的控制器以错误的类型响应。

    redirect_to 只能在 html 响应下工作。当您的请求类型是 'js' 的 'script' 时,无法呈现任何内容。

    改正

    def update
      # blah blah
      respond_to |format|
        format.html { redirect_to some_path }
        format.js # This will render default js template views/portfolio/update.js.erb
      end
    end
    

    然后准备js模板

    $('#div_to_update').html('new html code to update the view')
    

    【讨论】:

    • 它不刷新页面。您忘记在代码中添加 do。 Rails 的输出:渲染的投资组合/update.js.erb (0.0ms) Completed 200 OK in 4ms (Views: 1.6ms)
    • @DeependerSingla,如果使用 JS,重新加载页面不是很好,更新 div 是首选。例如,您在此处投票,页面不会刷新,但投票数增加。但是你仍然可以在 js 模板中添加任何你需要的 js 代码,比如 maximus 建议的windows.location.reload();
    • 比利说的很完美。阅读一些 Ajax 基础知识将帮助您更快地学习。这是一个很棒的一面w3schools.com/ajax/ajax_intro.asp