我有两张桌子:
客户端(ID,姓名,...)
购买(ID,项目,日期,CLIENT_ID,...)
他们有各自的模型及其验证。我需要的是创建一个新购买的新客户端,全部进入Client控制器的create方法。像这样:
def create
@client = Client.new(params[:client])
respond_to do |format|
if @client.save
# Add purchase
@sell = Purchase.new
@sell.client_id = @client.id
@sell.date = params[:date]
# Fill another fields
if @sell.save
# Do another stuff...
else
format.html { render :action => "new" }
format.xml { render :xml => @client.errors, :status => :unprocessable_entity }
end
flash[:notice] = 'You have a new client!'
format.html { redirect_to(:action => :show, :id => @evento.id) }
format.xml { render :xml => @client, :status => :created, :location => @client }
else
format.html { render :action => "new" }
format.xml { render :xml => @evento.client, :status => :unprocessable_entity }
end
end
end
在购买模型中,我有:
belongs_to :client
validates_format_of :date, :with => /^20[0-9]{2}[-][0-9]{2}[-][0-9]{2}$/, :message => 'not valid'
validates_presence_of :date
我的问题是:如何通过客户端控制器的模型验证来验证日期输入?而且,如何回滚错误时创建的新客户端?
是的,我可以将检查作为方法中的第一条指令,使用正则表达式,但我认为这很难看。我觉得可能存在执行此验证的传统方法,甚至可能以其他方式执行所有操作(即从客户端控制器调用create方法)。
你能以正确的方式让我回来吗?
提前谢谢。
答案 0 :(得分:2)
请查看working with associations上的以下页面。
Rails为您的对象提供了一系列方便的方法。
如下所示:
Client.purchases.empty?
Client.purchases.size,
Client.purchases
Client.purchases<<(purchase)
Client.purchases.delete(purchase)
Client.purchases.find(purchases_id)
Client.purchases.find_all(conditions)
Client.purchases.build
Client.purchases.create
使用这些方法时,您将利用每个模型的验证。
跳入您的Rails控制台并创建一个新客户端并尝试上述任何方法。你很快就会知道它们有多强大,你马上就可以了。
答案 1 :(得分:1)
取决于具体情况,但您可以使用validates_associated在关联对象上运行验证。然后您可以创建用户(但不保存),创建购买(但不保存)并尝试保存用户。如果你做得对,用户将无法在关联对象上保存验证错误。