【问题标题】:Rails 3.1: The new way to use 'respond_to ... format.js' without the 'page' variableRails 3.1:在没有 'page' 变量的情况下使用 'respond_to ... format.js' 的新方法
【发布时间】:2011-09-15 21:35:11
【问题描述】:

我正在尝试将 Ruby on Rails 更新到版本 3.1。我关注了Upgrading to Rails 3.1 截屏视频,除了声明之外,一切似乎都正常

format.js { render(:update) { |page| page.redirect_to @article } }

在许多控制器中,我有如下代码:

def create
  ...

  respond_to do |format|
    format.js { render(:update) { |page| page.redirect_to @article } }
  end
end

在上述所有情况下,当我尝试提交执行 JS 请求的相关表单时,我收到以下错误:

ActionView::MissingTemplate (Missing template articles/update, application/update with {:handlers=>[:erb, :builder, :coffee], :formats=>[:js, :html], :locale=>[:en, :en]}. Searched in:
  * "/<MY_PROJECT_PATH>/app/views"
):

app/controllers/articles_controller.rb:114:in `create'

Rendered /<...>/.rvm/gems/ruby-1.9.2-p136/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/missing_template.erb within rescues/layout (0.3ms)

我知道问题与 RJS 模板有关,因为它们在 3.1 版本中不再可用。因此,为了运行一些 JavaScript 代码,我可能\应该\可以在我的控制器文件中插入一些 JavaScript 代码,如下例所示:

format.js { render :js => "alert('Hello Rails');" }

顺便说一句:...但是,是否建议直接在控制器文件中使用 JavaScript 代码?

考虑到上面create控制器动作中的代码,我想在提交成功后将用户重定向到@article路径。我能做到:

format.js { render :js => "window.location.replace('#{article_url(@article)}');" }

..但是,我怎样才能按照“Ruby on Rails 做事的方式”来做同样的事情? RoR 3.1 将如何处理这些情况?

【问题讨论】:

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


    【解决方案1】:

    我会选择:

    render js: %(window.location.href='#{article_path @article}')
    

    或者在您的application_controller.rb 中添加类似的内容:

    def js_redirect_to(path)
      render js: %(window.location.href='#{path}') and return
    end
    

    然后在你的控制器中你可以调用:

    js_redirect_to(article_path @article)
    

    请注意,我只是编造的 - 未经测试 :)

    【讨论】:

    • 嗨,迈克——如果你必须传递参数,你会怎么做?对我来说,任何额外的参数'?被转换为 '%3F' 并且重定向失败。
    • @sscirrus 我已经更新了我的答案以使用参数。 (我从使用 window.location.pathname 切换到 window.location.href)。推理在stackoverflow.com/questions/3643041/… 解释得很清楚
    【解决方案2】:

    不建议直接在控制器文件中使用 javascript 代码。

    或者.rjs,您可以使用.js.erb 文件。它们的行为方式类似,允许访问实例变量和辅助方法。

    【讨论】:

    • 如果你纯粹使用JS来重定向用户,你应该控制器来做重定向。
    • 在我的问题中,我报告的示例“非常简单”,因为我只有两个创建控制器操作响应的情况。当响应案例更多时(即 JavaScript 有时可以重定向到文章路径,有时会重定向到另一个 URL 等等......),我该如何处理 .js.erb 文件中的那些“条件”响应? P.S.:我不确定,但我认为不建议为了处理这些情况而在控制器文件中声明类变量。你有什么建议?
    • 那么我在问题中提出的解决方案是否正确?您(或其他人)能否“确认”并让我更加确定?
    • 这是正确的做法。在动作中设置变量(例如@article),然后在 js.erb 中,您可以通过 Jquery、Prototype 等将其呈现到屏幕上......
    • @james_schorr - 也许我不清楚。运行 Ruby on Rails 3.1,我想处理 redirections 以响应 JavaScript 请求(我认为,它应该以某种方式在 format.js { ... } 语句中或以某种方式进行我想知道...)。 我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多