代码之家  ›  专栏  ›  技术社区  ›  jdog

如何在Javascript中访问Rails变量?

  •  0
  • jdog  · 技术社区  · 6 年前

    我有一个Rails变量,需要将所有日期和时间(send_time)拉入JS数组。我试图使用JS发送时间数组来阻止用户在将来使用这些日期/时间。想想安排一个一小时街区的会议室。两次会议不能同时举行。

    我已经检查了JS中的变量。

    var taken = <%= @taken.inspect.html_safe %>;
    

    这是检验变量

        var taken = [
    
        #<ScheduledRequest _id: 5b7f6b2842195a000400000f, send_time: 2018-08-25 18:00:00 UTC, sent_time: nil, warning_time: 2018-08-25 16:30:00 UTC, actual_send_time: 2018-08-25 16:45:00 UTC, processing: nil, retries: 10, pickup_address: "2209 West Anderson Lane, Boston, MA, USA", dropoff_address: "2209 West Anderson Lane, Boston, MA, USA", round_trip: false, token: nil, pickup_location: [-37.729439, 40.355348], dropoff_location: [-47.729439, 30.355348], notes: "Scheduled: Simple assembly and take away trash.", ip: "XHgw1nn3xIHzfs5t2xzZ/ez0Tj5gg=", notify_email: "", notify_phone: "", user_id: "53f4b008", thingy_type: "Blue Row", thingy_request_id: nil, error: nil, two_hour_warning_sent: nil, identifier: nil, estimated_time: "", thingy_request_log: nil, for_customer_api: false, removed: false, edit_date: "2018-08-25", edit_hours: "01", edit_minutes: "00", edit_ampm: "PM">, 
    
        #<ScheduledRequest _id: 5b7f92964029e90004000013, send_time: 2018-08-28 01:00:00 UTC, sent_time: nil, warning_time: 2018-08-27 23:30:00 UTC, actual_send_time: 2018-08-27 23:45:00 UTC, processing: nil, retries: 10, pickup_address: "5501 Spicewood Springs Road, Boston, MA, USA", dropoff_address: "2345 West Anderson Lane, Boston, MA, USA", round_trip: false, token: nil, pickup_location: [-77.771753, 20.384814], dropoff_location: [-57.7322452, 10.356484], notes: "Scheduled:", ip: "XHgwMmB7fk1lRn1Bg8ooqhwM4xQsg=", notify_email: "", notify_phone: "", user_id: "53f4b08", thingy_type: "Blue Row", thingy_request_id: nil, error: nil, two_hour_warning_sent: nil, identifier: nil, estimated_time: "", thingy_request_log: nil, for_customer_api: false, removed: false, edit_date: "2018-08-27", edit_hours: "08", edit_minutes: "00", edit_ampm: "PM">
    
        ];
    

    更新:

    我去掉了数据,创建了一个新的Ruby数组。

    result = []
    sr.each do |r|
      record = {}
      record[:send_time] = r.send_time
      record[:ambulance_type] = r.ambulance_type
      result << {:ambulance => record}
    end
    result
    

    var taken = <%= @taken.as_json %>;

    现在得到这个(删除敏感信息的数据)。

    var taken = [{&quot;thingy&quot;=&gt;{&quot;send_time&quot;=&gt;&quot;2018-08-25T18:00:00.000+00:00&quot;, &quot;thingy_type&quot;=&gt;&quot;Row Delivery&quot;}}
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   rfestag    6 年前

    首先,请注意 as_json to_json . 作为json 返回一个散列,然后将其字符串化。 到json 将实际创建一个JSON字符串。有关详细信息和参考资料,请参见本问题: Difference between as_json and to_json method in Ruby

    我建议你更新你的 ScheduledRequest 模型有一个 作为json each 更新(返回单个 日程安排请求 . 那么,在你看来,你可以

    var taken = <%= @taken.to_json.html_safe %>

    到json 将返回一个JSON数组,并且 html_safe 将确保它不会得到html编码(这是您在上面看到的)。为如何表现个人而运用逻辑 对象确保类负责确定如何将自身表示为JSON,而不是将其作为视图关注点。注意,正如你所拥有的,你正在 @taken 在javascript中可访问的变量 taken

        2
  •  2
  •   Marek Lipka    6 年前

    是 啊, @taken.inspect.html_safe 并不是将activerecord关系传递给JS的好方法,如您所见。如果将其作为json传递,可能会更有意义:

    var taken = <%= @taken.as_json %>
    

    不过,请记住,这样您就可以将所有记录的内容公开到前端,这可能是不需要的。