我正在使用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
时。
答案 0 :(得分:2)
正如您所说,构建是在关联代理上定义的方法。你可以做的是使用关联扩展,所以在模型中你可以将一个块传递给你的has_many调用,这将被视为给定association_proxy的扩展:
class Article < ActiveRecord::Base
...
has_many :comments do
alias_method_chain :build, :option_name
end