ruby - 如何在 ruby​​ on rails 中从另一个应用程序调用一个应用程序中的方法

标签 ruby ruby-on-rails-3

我想在我的应用程序中调用该方法并从另一个采用 Ruby on Rails 技术的应用程序中获取响应,但是这里存在跨站点脚本问题。所以,我可以解决这个问题吗?请帮助我,这会很棒。

http://video_tok.com/courses/get_course

def get_course
  @course = Course.find(params[:id])
end

现在我想从这个在 edupdu.com 域中运行的应用程序调用上面的方法

http://edupdu.com/call_course_method

def call_course_method
  @course = redirect_to "http://video_tak.com/courses/get_course/1"
end

但它会被重定向到 video_tak.com 应用程序。 我想调用 get_course 方法并在内部获取 @course 对象而不重定向到另一个站点。

提前致谢。

最佳答案

跨域AJAX确实是个问题,但没有解决不了的问题。在您的 get_course 方法中,您可以将类(class)对象作为 JSON 响应返回,如下所示:

render json: @course

从那里您可以通过 JavaScript (AJAX) 检索类(class),在这里您应该使用 JSONP 或在 Rails 内部通过发出 HTTP GET 请求。

  1. 使用 JSONP 的 AJAX

    有JSONP(JSON with padding),这是一种通信技术,为JavaScript程序提供一种向不同域的服务器请求数据的方法。看着 jQuery.getJSON() 的文档并向下滚动到 JSONP 部分。

    If the URL includes the string "callback=?" (or similar, as defined by the server-side API), the request is treated as JSONP instead. See the discussion of the jsonp data type in $.ajax() for more details.

  2. HTTP GET 请求

    只需使用 Net::HTTP 类:

    require 'net/http'
    require 'json'
    
    url = URI.parse('http://video_tak.com/courses/get_course/1')
    req = Net::HTTP::Get.new(url.to_s)
    res = Net::HTTP.start(url.host, url.port) do |http|
      http.request(req)
    end
    course_json = JSON.parse(res.body)
    

    如果您为模型提供了将 JSON 转换为您的域对象的方法,则可以从那里获取它。


远程调用

您还可以使用 RPC 在不同的 Ruby 进程之间调用方法,尽管我最不推荐这样做,但我不想忽略它。有几个远程过程调用 (RPC) 库。 Ruby 标准库提供 DRb , 但也有基于 Ruby on Rails 的实现,例如 rails-xmlrpc gem 允许你基于 XML-RPC 实现 RPC协议(protocol)或使用 JSON 和 json-rpcj 的替代协议(protocol)

在搜索 Rails RPC 时,您可能会找到更多的库。无论您选择哪种库,具体的解决方案都会有所不同。

关于ruby - 如何在 ruby​​ on rails 中从另一个应用程序调用一个应用程序中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18203352/

相关文章:

ruby-on-rails - Rails 3应用服务器启动时间很长

ruby - 如何在不复制字符串的情况下裁剪它

ruby - 无法在示例表的字符串中插入空格

ruby - 如何将数组写入每个值都带有引号的文件?

javascript - 单选按钮(带点击事件)不在 Firefox 中传递参数

ruby-on-rails-3 - rails twitter bootstrap helper 方法

ruby-on-rails-3 - Rails 3,大型多步形式 : 1 large controller or separated by resource?

ruby-on-rails - 在 rails 4 中重构一个大的 routes.rb 文件

ruby - curl 从命令行运行,但不在 ruby​​ 脚本中运行

ruby-on-rails-3 - Rails 3.2.11 性能测试问题 : Don't know how to build task 'test:benchmark'