2011-07-02 19 views
4

私はRuby on Rails 3.0.7を使用していますが、私のアプリケーションにはact_as_articleプラグインを実装しようとしています。私のやりたいことは、そのプラグインの中でバリデーションの "プラグインとしての記事クラス"のメソッドを実行することです(注:私のプラグインは動作するためにデータベーステーブルの列を作成する必要があります。プラグインでの検証方法

# vendor/plugins/article/lib/acts_as_article.rb 
module Article 
    extend ActiveSupport::Concern 

    included do 
    validates :title, # Validation method 
     :presence => true 
    end 

    module ClassMethods 
    def acts_as_article 
     send :include, InstanceMethods 
    end 
    end 

    module InstanceMethods 
    ... 
    end 
end 

ActiveRecord::Base.send :include, Article 


# app/models/review.rb 
class Review 
    acts_as_article 

    ... 
end 

プラグインが動作する上記のコードを使用して:私のRoRのアプリケーションで

私はこのコードを持っています。しかし、私はこのようなReviewクラスにいくつかのレコード協会を追加した場合:

class Review 
    acts_as_article 

    has_many :comments # Adding association 

    ... 
end 

と私ReviewsControllerに私も、次の行を追加します。

def create 
    ... 

    @article.comments.build( # This is the code line 89 
    :user_id => @user.id 
) 

    if @article.save 
    ... 
    end 
end 

私はこのエラーに

NoMethodError (undefined method `title' for #<Comments:0x00000103abfb90>): 
    app/controllers/articles_controller.rb:89:in `create' 
を取得

これはおそらく、すべてのReview「関連する」クラス\モデルとCommentクラスは、属性を持っていません。私は、プラグインのコード内で私はこの

module Article 
    ... 

    included do 
    # validates :title, # Validation 
    # :presence => true 
    end 

    ... 
end 

のような検証方法をコメントアウトした場合ので、私はもうエラーが出ていないと思います。

だから、どうすればこの問題を解決できますか?

+0

これはおそらく次のような場合に役立ちます。https://github.com/apneadiving/Google-Maps-for-Rails/blob/master/lib/gmaps4rails/acts_as_gmappable.rb – apneadiving

答えて

2

あなたがいる...私は(これは私の初めてです)プラグインの作成に関する専門家ではないですので、私はプラグイン実装のために良い仕事をやっている場合、私は暗黙のうちにも頼みますActiveRecord :: Baseにはvalidates_presence_of:タイトルが含まれているため、すべてのアクティブなレコードモデルがそれを取得しています。代わりに、あなたが行う必要があります:

# vendor/plugins/article/lib/acts_as_article.rb 
module Article 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def acts_as_article 
     validates :title, # Add validation method here 
     :presence => true 
     send :include, InstanceMethods 
    end 
    end 

    module InstanceMethods 
    ... 
    end 
end 

したがって、検証が通過することを期待するActiveRecordモデルの検証だけを含めるようにする必要があります。これがあなたの問題を解決すれば教えてください。

+0

はい、問題が解決しました。 – Backo

関連する問題