从Rails中的另一个控制器验证模型的数据

时间:2008-11-13 19:30:31

标签: ruby-on-rails ruby model-view-controller

我有两张桌子: 客户端(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方法)。

你能以正确的方式让我回来吗?

提前谢谢。

2 个答案:

答案 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控制台并创建一个新客户端并尝试上述任何方法。你很快就会知道它们有多强大,你马上就可以了。

修改: Here's a much better guide on Rails associations!

答案 1 :(得分:1)

取决于具体情况,但您可以使用validates_associated在关联对象上运行验证。然后您可以创建用户(但不保存),创建购买(但不保存)并尝试保存用户。如果你做得对,用户将无法在关联对象上保存验证错误。