Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:将API JSON响应传递给视图,不带模型_Ruby On Rails_Json_Decorator - Fatal编程技术网

Ruby on rails Rails:将API JSON响应传递给视图,不带模型

Ruby on rails Rails:将API JSON响应传递给视图,不带模型,ruby-on-rails,json,decorator,Ruby On Rails,Json,Decorator,免责声明:我正在做的事情可能有资格获得2015年代码气味奖。使用Rails4.2,没有javascript之类的东西 我有一个表单,用户可以在其中输入数据。有了这些数据,我调用了第三方API,该API将保持匿名状态。:) 我没有模型,我没有坚持任何东西。(一个更大的应用程序的一部分,而不是一个页面。)因此,当面对向用户呈现响应时,我发现自己陷入了如何将数据正确呈现到视图中的困境。响应包含一个哈希数组,我显然打算向用户展示它 我将表单呈现为widget/new等,创建并处理请求等,但是接下来呢 我

免责声明:我正在做的事情可能有资格获得2015年代码气味奖。使用Rails4.2,没有javascript之类的东西

我有一个表单,用户可以在其中输入数据。有了这些数据,我调用了第三方API,该API将保持匿名状态。:)

我没有模型,我没有坚持任何东西。(一个更大的应用程序的一部分,而不是一个页面。)因此,当面对向用户呈现响应时,我发现自己陷入了如何将数据正确呈现到视图中的困境。响应包含一个哈希数组,我显然打算向用户展示它

我将表单呈现为widget/new等,创建并处理请求等,但是接下来呢

我想也许我可以利用装饰师来完成我的脏活,但不知道如何让用户真正进入各自的视图。我不在乎哪种观点。称之为小部件路径

WidgetsController < ApplicationController
  def new
    render :new
  end      

  def create
    # preparing request        
    ...
    # data = response, each_serializer, WidgetSerializer, root: false
    # data = WidgetDecorator.new(render_serialized(response, WidgetSerializer))
    # @data = WidgetDecorator.new(JSON.parse(response))
    # redirect_to ??_path ... and take your @data with you
  end
end
WidgetsController
我该怎么办

不幸的是,您对模型的想法被Rails本身破坏了(对不起)。 模型是业务逻辑而不是ActiveRecord::Base(不一定)。控制器方法不应该太大,~5行可能是最大长度,每个控制器文件最多100行。试着坚持这一点,它会自动纠正代码的味道

无论如何,您可以用一个模型来处理这个问题,比如PORO(普通的老ruby对象)

所以在控制器中,您可以执行以下操作

def create
  myapiresponse = MyApiResonse.new(myapikey, whatever)
  @response     = myapiresponse.get
end
最后但并非最不重要的一点是,您不能在重定向中传递通过API获得的内容。您受到HTTP限制,因此,GET参数大小有限制,会话有限制,并且无法重定向到POST。你有3个选择

  • 最好的方法是将给定用户的最后一个api请求存储在数据库中,并通过ID(将通过重定向)将其取回
  • 如果请求非常小,请将其存储在会话中(您必须确保它很小!)
  • 重定向后再次执行API请求,非常糟糕。否则,仅在重定向后执行API请求,但不确定这是否是一个选项

  • 明白了,谢谢@Fire,非常有用。我在看#1。将任何JSON响应作为字符串持久化并在您认为的另一端进行解析是否可行?是的,这应该是绝对可行的。但是,如果您只存储(对于当前用户)一个
    last_response
    字段,那么就更容易了,因此您甚至不需要id。如果您使用的是postgresql 9.3+,那么JSON字段类型非常好,否则只需在您的响应上调用
    来_JSON
    ,并将其存储在任何
    文本
    字段中,它是一个
    最后的\u响应
    或一个适当的表。这也是我处理API数据的方式。但是,在找出处理表单的最佳方法时遇到了困难
    def create
      myapiresponse = MyApiResonse.new(myapikey, whatever)
      @response     = myapiresponse.get
    end