我应该如何将alias_method_chain用于构建方法?

我正在使用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 `' 

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


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

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

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

 class Article < ActiveRecord::Base ... has_many :comments do alias_method_chain :build, :option_name end