Pha*_*ale 22 ruby validation activerecord ruby-on-rails ruby-on-rails-3
我在铁轨上写了一个向导表格; 例如,一个模型对象的多个输入页面.
我的方法的基础是Ryan Bates的Multistep形式railscast中描述的那些:http: //railscasts.com/episodes/217-multistep-forms (如果有人想知道下面某些代码背后的原因).
这里审查的对象是"参与者",其中有一个"地址"
我的问题是,我只想在用户尝试通过地址输入屏幕时验证嵌套对象(地址).目前通过名为"current_step"的Participant模型上的属性来跟踪
所以我有一个参与者:
class Participant < ActiveRecord::Base
has_one :address
accepts_nested_attributes_for :address
validates_presence_of :first_name, :last_name, :if => self.current_step == "name"
...
def steps = %w[ name address confirm ] # the steps the wizard will follow
end
Run Code Online (Sandbox Code Playgroud)
和地址:
class Address < ActiveRecord::Base
belongs_to :participant
validates_presence_of :address1, :state, :suburb, :postcode #, :if => participant.current_step == "address"
end
Run Code Online (Sandbox Code Playgroud)
这种方法的原理是在向导的每个步骤中在控制器(未示出)上调用"创建"动作,并且它仅在处理每个步骤时验证模型的子集.
目前,当我完成第一个屏幕("名称")并尝试进入地址步骤时,地址验证将被触发,我将被发送回"名称"屏幕,其中包含空白地址详细信息的验证错误.
所以我在这里尝试了很多方法,其中最后一部分是上面显示的地址验证的注释条件 - 我发现这不起作用,因为我只构建参与者 - >地址对象,但不保存他们.因此@participant.address获取地址对象,但是@participant.address.participant为null,因为地址还没有一个participant_id外键来查找它的父级.
我挣扎的原因似乎是包含了超级方便的accepts_nested_attributes_for方法.我期望使用a validates_associated来进行验证,但我发现accepts_nested_attributes_for标签既可以很好地传播表单参数来创建嵌套模型对象,但也可以确保participant#valid?方法调用所有情况下的地址验证.
所以我的困境是如何最好地使用该participant#valid?方法来验证部分完整的模型,基于current_step参与者的参数?
编辑 - 更新以删除额外信息,并提炼到核心问题
Har*_*tty 18
在Address模型上添加虚拟属性:
class Address < ActiveRecord::Base
belongs_to :participant
attr_accessor :skip_validation
validates_presence_of :address1, :state, :suburb, :postcode,
:unless => :skip_validation
end
Run Code Online (Sandbox Code Playgroud)
设置后,在地址对象上设置虚拟属性current_step.
class Participant < ActiveRecord::Base
has_one :address
accepts_nested_attributes_for :address
attr_accessor :current_step
validates_presence_of :first_name, :last_name,
:if => lambda {|r| r.current_step == "name"}
def current_step=(value)
unless (value == "address")
address.skip_validation = true
end
@current_step = value
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5966 次 |
| 最近记录: |