【问题标题】:Rails Controller - Inherit a Custom ActionRails 控制器 - 继承自定义操作
【发布时间】:2014-03-26 13:37:04
【问题描述】:

我已经使用继承干掉了控制器代码。

class MastersController < ApplicationController
  def index
    ...
    ...
  end

  ...
  ...
end

class ItemsController < MastersController
end

现在我已经向 MastersController 添加了一个自定义操作

class MastersController < ApplicationController
  def index
    ...
    ...
  end

  ...
  ...

  def clone
    ...
    ...
  end
end

我已经为项目添加了路线

resources :items do
  get :clone
end

现在当我尝试访问 myapp.dev/items/1/clone 时,出现错误

AbstractController::ActionNotFound at /items/1/clone
The action 'clone' could not be found for ItemsController

如果我在 ItemsController 中添加“克隆”操作,错误就会消失。

class ItemsController < MastersController
  def clone
    ...
    ...
  end
end

如何在 Rails 控制器中抽象自定义操作?

【问题讨论】:

  • 关于同一主题的另一个问题stackoverflow.com/questions/22604996/…
  • 这是一个答案吗? stackoverflow.com/questions/3998286/…(tadman 的回答)
  • clone 是否低于任何私有方法?尝试在def clone上方添加一行public
  • 不是私有的。从屏幕截图中,错误是从 AbstractController 引发的。它根本没有到达我的任何代码。
  • 我遇到了同样的问题 - 我在 ApplicationController 中定义了一个动作 clone,但无法在 ItemsController 中使用它。但是如果我直接在ItemsController 中定义clone,它就像你发现的那样工作。当我将它从clone 重命名为copy 时,它直接在ApplicationController 中定义,效果很好。我从来没有找到原因 - 有一个 Rails 和 Ruby 方法clone - 不知道它是否连接。

标签: ruby-on-rails ruby-on-rails-4 controller


【解决方案1】:

你可以这样使用它

   def clone
     super
   end

在您的子控制器中

【讨论】:

    【解决方案2】:

    不能将clone 用作从父控制器继承的操作。除了您的 MastersController 之外,ApplicationController 也是如此。

    将您的操作重命名为copy,您将能够在MastersController 中定义它并正确路由到ItemsController#copy

    请注意,我无法告诉你这是为什么。在 Object 类中定义了一个 Ruby 方法 clone。我怀疑这就是原因——也许有更多知识的人可以解释一下。

    【讨论】:

    • ActiveRecord 有一个克隆方法。我的代码几乎看起来像这样。 def copy @master = @master.clone 渲染:新结束
    • 现在实际上只是文档;我认为该方法在 v2.3.8 中已被弃用,现在它直接下降到 Ruby 的Object#clone
    猜你喜欢
    • 2012-07-31
    • 2011-12-06
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多