Rails:将API JSON响应传递给View,不带Model

时间:2015-07-08 17:49:22

标签: ruby-on-rails json decorator

免责声明:我正在做一些可能有资格获得2015年Code Smell奖的东西。使用rails 4.2,没有javascript或类似的东西。

我有一个用户输入数据的表单。有了这些数据,我就称之为第三方API,它仍然是无名的。 :)

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

我将表单渲染成小部件/ new等,创建并处理请求等,但那又是什么?

我想也许我可以利用装饰工来做我的肮脏工作,但不知道如何让用户真正进入相应的视图。我不在乎哪种观点。称之为widget_path。

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

我该怎么办?

1 个答案:

答案 0 :(得分:1)

您对模型的想法不幸被Rails本身损坏(抱歉)。 模型是业务逻辑 而不是ActiveRecord :: Base (不一定)。控制器方法不应该很大,~5行长可能是最大值,每个控制器文件最多~100行。尽量坚持这一点,它会自动纠正好的代码气味。

无论如何,您可以使用 Model 处理此事件,作为PORO(普通旧ruby对象)。

class MyApiResponse

  attr_reader :myapikey
  attr_reader :whatever

  def initialize(myapikey, whatever)
    @myapikey = myapikey
    @whatever = whatever
  end

  def get
    @_response ||= JSON.parse(run_api_stuff(myapikey))
  end

end

所以在控制器中你会做类似

的事情
def create
  myapiresponse = MyApiResonse.new(myapikey, whatever)
  @response     = myapiresponse.get
end

最后但并非最不重要的是,您无法在重定向中传递通过API获得的内容。您受HTTP限制,因此,您对GET参数大小有限制,会话限制,您无法重定向到POST。你有3个选择

  1. Best是存储数据库中给定用户的最后一个api请求,并通过ID(将通过重定向)获取它
  2. 如果请求非常小,则将其存储在会话中(并且必须确保它很小!)
  3. 重定向后再次执行API请求,太可怕了。否则,在重定向后执行API请求 ,不确定这是否是一个选项