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

时间:2013-08-10 14:46:33

标签: ruby-on-rails ruby methods associations alias

我正在使用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_chain用于build方法?或者,或许更好,我应该以其他方式继续达到我想做的目标(对于例如,我应该覆盖build模型中的Articles::Comment方法,而不是使用alias_method_chain)吗?


注意我:我不知道它是否有帮助,但build方法引用了一个关联(@article.comments)。更多,我没有在build模型中陈述Articles::Comment方法,因为它应该由Ruby on Rails框架本身“添加”/“附加”到类(我认为它是通过meta创建的) -programming)。

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

1 个答案:

答案 0 :(得分:2)

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

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