accepts_nested_attributes_for:reject_if触发另一种方法

时间:2011-02-19 03:52:00

标签: ruby-on-rails nested-attributes

我使用formtastic_cocoon(formastic的jquery版本)获得了一个多级嵌套表单。

我正在尝试从

的意义上做一些验证
if value is_numeric do
     insert into database
else do
     database lookup on text
     insert id as association
end

我希望accepts_nested_attributes_for有一个:if选项,但显然只有:reject_if。

有没有办法像我描述的那样创建一个验证,作为accepts_nested_attributes_for的一部分?

-----------------------根据Zubin的回复更新------------------- --------

我相信Zubin用一种方法走在正确的轨道上,但我似乎无法让它正常工作。我正在使用的方法是


    def lookup_prereq=(lookup_prereq)
        return if lookup_prereq.blank?
            case lookup_prereq
        when lookup_prereq.is_a?(Numeric) == true
            self.task_id = lookup_prereq
        else
            self.task = Task.find_by_title(lookup_prereq)
        end
    end

当我触发此函数时,self.task_id将被放入数据库中,而不是Task.id.

我想知道我是否遗漏了别的东西。 我不完全确定该方法实际上是被调用的。我不应该说

lookup_prereq(attr[:prereq_id)

在某个时候?

-------------------进一步编辑----------------------- 我想我可以发现只有在命名方法与数据库的名称相同的情况下才调用该方法,因此我将方法更改为

def completed_task=(completed_task)

不幸的是,这仍然是数据库中的值0。

1 个答案:

答案 0 :(得分:1)

听起来你需要在嵌套模型中使用一个方法来处理它,例如:

class Post < ActiveRecord::Base
  has_many :comments
  accepts_nested_attributes_for :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
  belongs_to :author

  def lookup_author=(lookup_author)
    return if lookup_author.blank?
    case lookup_author
    when /^\d+$/
      self.author_id = lookup_author
    else
      self.author = Author.find_by_name(lookup_author)
    end
  end
end