Rails escape_javascript为json

时间:2016-01-22 19:39:45

标签: ruby-on-rails

我可以使用JSON响应来执行escape_javascript吗?

我运行Rails 4.2.1并使用Facebook测试OAuth。我用Facebook SDK制作了带有远程true和ajax请求的link_to。

  window.fbAsyncInit = ->
    FB.init
      appId: 'AppID'
      status: true
      cookie: true
      xfbml: true
    return

  ((d) ->
    js = undefined
    id = 'facebook-jssdk'
    if d.getElementById(id)
      return
    js = d.createElement('script')
    js.id = id
    js.async = true
    js.src = '//connect.facebook.net/en_US/all.js'
    d.getElementsByTagName('head')[0].appendChild js
    return
  ) document
  $ ->
    $('#facebook, #vkontakte').click (e) ->
      e.preventDefault()
      FB.login ((response) ->
        if response.authResponse
          $('.modal').modal('hide')
          # $('#results').html 'Connected! Hitting OmniAuth callback (GET users/auth/facebook/callback)...'
          # since we have cookies enabled, this request will allow omniauth to parse
          # out the auth code from the signed request in the fbsr_XXX cookie

          $.getJSON '/profile/auth/facebook/callback', (json) ->
            # $('#results').html JSON.stringify(json)
            # Do some other stuff here (call more json, load in more elements, etc)
            return
        return
      ), scope: 'email'
      # These are the permissions you are requesting
      return
    $('#connect .signout').click (e) ->
      e.preventDefault()
      $.getJSON '/auth/facebook/signout', (json) ->
        $('#results').html JSON.stringify(json)
        return
      return
    return

一切正常,我让我的用户使用他的帐户登录,但是我需要进行一些前端更新(即重新渲染一些部分等等)。我喜欢远程true和javascript_escape概念所以我想很高兴在JSON上使用相同,但找不到任何例子..

2 个答案:

答案 0 :(得分:0)

当您将链接设为远程true时,您的控制器将默认尝试呈现action.js.erb视图文件,其中action是您路由到的操作的名称,例如show.js.erb

在该视图文件中,您将编写javascript和嵌入式Ruby,就像在html.erb视图文件中一样。

如果要在页面上重新呈现部分内容,则必须使用render_javascript渲染方法的结果,以便可以安全地将html字符串传递给javascript。

$("#some-div").html("<%= escape_javascript render(partial: "some_content") %>");

请注意,erb标记位于引号内,这样您最终会将字符串传递给html函数。您还可以使用快捷方式助手j

$("#some-div").html("<%= j render(partial: "some_content") %>");

http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html

答案 1 :(得分:0)

最后提出了另一个想法,ajax js制作技巧的一点变化。

$('#facebook, #vkontakte').click (e) ->
  e.preventDefault()
  FB.login ((response) ->
    $('.modal').modal('hide')
    # $('#results').html 'Connected! Hitting OmniAuth callback (GET users/auth/facebook/callback)...'
    # since we have cookies enabled, this request will allow omniauth to parse
    # out the auth code from the signed request in the fbsr_XXX cookie

    # $.getJSON '/profile/auth/facebook/callback', (json) ->
    $.get '/profile/auth/facebook/callback' if response.authResponse
  ), scope: 'email'
  # These are the permissions you are requesting
  return