【问题标题】:Validation methods in plugins插件中的验证方法
【发布时间】:2011-07-02 13:29:41
【问题描述】:

我正在使用 Ruby on Rails 3.0.7,我正在尝试为我的应用程序实现一个 act_as_article 插件。我要做的是为该插件内的“充当文章类”运行 validation 方法(注意:我的插件需要创建一些数据库表列才能工作 - 其中之一由title 属性)。

在我的 RoR 应用程序中,我有以下代码:

# 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

使用上面的代码插件可以工作。但是,如果我在 Review 类中添加一些 Record Association,如下所示:

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没有title 属性的验证运行。我认为这是因为如果在插件代码中我像这样注释掉验证方法

module Article
  ...

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

  ...
end

我不再收到错误了。

那么,我该如何解决这个问题?

注意:我不是创建插件的专家(这是我第一次),所以我也含蓄地问我是否在插件实现方面做得很好......

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-3 validation plugins


【解决方案1】:

您将 validates_presence_of :title 包含在 ActiveRecord::Base 中,因此每个活动记录模型都在使用它。相反,您应该这样做:

# 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 模型上包含验证。如果这能解决您的问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多