【问题标题】:How to pass a variable from controller to javascript within a view?如何将变量从控制器传递到视图中的javascript?
【发布时间】:2012-10-15 16:46:41
【问题描述】:

我有一个数组@fields,它有文本和一个id,asset_id。 要将局部变量从控制器传递到渲染中的视图,我们使用

render(:template => "assets/invalid", :locals => {:asset_id => params[:id], :fields => @fields})

观点是

<div id="panel">
  <script>
    alert('Invalid values for ')
    window.location = "../assets/" 
  </script>
</div>

这应该会生成一个弹出框。但是,我希望弹出框重定向到“../assets/asset_id”并显示“+ 字段的无效值”

以下不起作用,

<div id="panel">
  <script>
    var fields = fields
    var asset_id = asset_id 
    alert('Invalid values for ' + fields )
    window.location = "../assets/" + asset_id 
  </script>
</div>

【问题讨论】:

  • 当你执行 rake 路由时,你会看到 /assets/:id 吗?
  • 是的,我确实看到了。警报框重定向到 ../assets/。我希望它重定向到 ../assets/asset_id。
  • 发布您如何获取asset_id 以及您希望如何发送它。由于它的 html.erb 你可以抓住它。
  • assets_id 来自控制器。我想将其发送到视图中的脚本以创建该资产的位置,即重定向到该 ID 页面。渲染中的 :local 应该将其发送到视图,不是吗? JS 必须为 window.location 创建该链接以重定向到。

标签: javascript ruby-on-rails ruby ruby-on-rails-3 partial-views


【解决方案1】:

就这么简单吗?

<div id="panel">
  <script>
    var fields = <%= fields.to_json %>
    var asset_id = <%= asset_id.to_json %>
    alert('Invalid values for ' + fields )
    window.location = "../assets/" + asset_id 
  </script>
</div>

更新顺便说一句,为什么需要将fieldsparams 作为局部变量传递,为什么在您的视图中不使用@fields

【讨论】:

  • .to_json 方法不起作用。视图(警报框)不显示。如果我像@Viren 所说的那样将其保留为字段,则警告框会显示“未定义的无效值”。
  • 检查页面源——它被转换成什么
  • fields 是字符串数组,asset_id 是字符串
【解决方案2】:

我在几个应用程序中使用的一种方法是,客户端代码必须使用服务器数据来构建哈希并将其呈现为页面上的 json 文字,并让我的所有 JS 引用该对象。它与上面提到的方法相同,但更简洁一些,因为您不必在 JS 代码中混合大量服务器标签。更易于阅读和维护。

【讨论】:

    【解决方案3】:

    这有什么问题

    <div id="panel">
      <script>
        var fields = fields
        var asset_id = <%= asset_id %> 
        alert('Invalid values for ' + fields )
        window.location = "../assets/" + asset_id 
      </script>
    </div>
    

    现在您可以将数据传递到 html 以进行高级操作,您可以使用 gon 之类的东西查看 gon gem,它可能会有所帮助

    【讨论】:

    • 数组的 to_s 在 Ruby 版本中不能始终如 JS 一样解析。虽然数组的inspect 输出大部分是,但使用to_json 更安全。
    • @Phrogz Point 非常值得期待
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 2011-09-14
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多