【问题标题】:Rails 4 - Controller uses view path of super controllerRails 4 - 控制器使用超级控制器的视图路径
【发布时间】:2014-08-28 12:09:14
【问题描述】:

我有一个继承自 BaseSwitchesController 的 SwitchesController,用于 json。

module Api
  module V1
    class SwitchesController < BaseSwitchesController
      respond_to :json
    end
  end
end

我有另一个 SwitchesController,也继承自 BaseSwitchesController,用于 html。

class SwitchesController < BaseSwitchesController
  layout 'application'
end

BaseSwitchesController 继承自 ApplicationController。

class BaseSwitchesController < ApplicationController
  def update
    respond_to do |format|
    if @switch.update(switch_params)
      format.html { redirect_to @switch, notice: 'Switch was successfully updated.' }
      format.json { render json: @switch.as_json.merge(:message => 'set_switch_value') }
    else
      format.html { render action: 'edit' }
      format.json { render json: @switch.errors, status: :unprocessable_entity }
    end
  end
end

我想将 json 移动到 API 模块中的 SwitchesController。 问题是 SwitchesController 中的方法正在寻找 views/base_switches 中的视图,但该文件夹不存在。它应该在视图/开关中寻找视图,并选择例如index.json.rabl.

我该如何解决这个问题?谢谢!

【问题讨论】:

  • 您是否在 BaseSwitchesController 中硬编码了渲染或重定向路径?向我们展示您的 BaseSwitchesController
  • 我对问题做了一些修改。
  • 我希望 Rails 在views/base_switches 中查找views/switches(但不是按这个顺序)。这就是模板继承的工作原理。

标签: ruby-on-rails ruby inheritance ruby-on-rails-4 model-view-controller


【解决方案1】:

我不会亲自将 API 控制器与 HTML 控制器混合在一起。

我发现两种情况是标准的。

  1. 您没有传统的 API(具有自己的宁静路由、版本控制等),并且您以 html 和 json 响应。在这种情况下,您可以在 url 上使用 .format 扩展名或使用请求标头访问格式。这对两种格式使用相同的视图

  2. 您确实有一个单独的 API,在这种情况下您不会将视图混合在一起,它允许您使用 ActiveRecordSerializers、Rabl 或任何您想使用的模板方法。

你的例子也反对子类化。子类应该是超类的特化,并且应该包含它们与其他子类的区别。您的超类包含来自两个子类的特殊行为。因为我假设您不想在 API 控制器之外响应 json。 希望对您有所帮助

【讨论】:

  • 感谢您的回答。我最大的问题是我复制了大部分代码(所以不是很干)。您知道我该如何解决吗?而且我想将专门的行为转移到子类中,因此超类中的代码只是 api 和 html 控制器都将使用的代码。只是想知道你的意见。
  • 我明白你的意思。就我个人而言,我会忍受这种小小的重复,但主要是出于一个原因:独立。那就是如果你想要它。在您的示例中,没有太多重复,因为您可以只在一个控制器中渲染 json 并在另一个控制器中渲染 html,几乎没有重复。您也可以将它们放在一起,至少对于这种特殊情况也是如此。例如,当我愿意让两个响应不同并允许不同类型的安全性时,我会费心制作 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多