2

我正在使用 Ruby on Rails 3.2.13 并且我想正确使用该alias_method_chain :build, :option_name语句,因为我遇到了一个奇怪的错误。那是, ...

...在我的控制器文件中,我有:

class Articles::CommentsController < ApplicationController
  def create
    @articles_comment = @article.comments.build(params[:comment])
    ...
  end
end

...在我的模型文件中,我有:

class Articles::Comment < ActiveRecord::Base
  def self.build_with_option_name
    ...
  end

  alias_method_chain :build, :option_name
end

当我运行create控制器操作时,我在日志中收到以下错误:

ActionController::RoutingError (undefined method `build' for class `Articles::Comment'):
  app/models/articles/comment.rb:5:in `<class:Comment>'

我应该如何使用alias_method_chainforbuild方法?或者,也许更好,我应该以另一种方式继续达到我想做的事情(例如,我应该覆盖模型build中的方法Articles::Comment而不是使用alias_method_chain)?


注意我:我不知道它是否有帮助,但该build方法是指关联(@article.comments)。此外,我没有build在模型中说明方法,Articles::Comment因为它应该由 Ruby on Rails 框架本身“添加”/“附加”到类(我认为它是通过元编程制作的)。

注二:在考虑使用new方法时会出现同样的错误build;也就是说,当使用alias_method_chain :new, :option_name.

4

1 回答 1

2

如您所说, build 是在关联代理上定义的方法。您可以做的是使用关联扩展,因此在模型中您可以将块传递给您的 has_many 调用,这将被视为给定关联代理的扩展:

class Article < ActiveRecord::Base
  ...
  has_many :comments do
    alias_method_chain :build, :option_name
  end
于 2013-08-10T21:03:44.053 回答