2013-05-14 49 views
0

修復& RepairItems之間存在親子關係。Ruby:僅在至少存在1個孩子的情況下才創建父母

修復必須至少保存1個RepairItem。我製作了一個嵌套(簡單)的表單來創建一個修復並顯示3個空白的repair_items。

我想解決如何確保修復至少有1個repair_item,允許用戶保存修復。否則,我需要提示用戶,修復不能保存,直到至少1個repair_item被輸入..

任何人都可以點我在正確的方向進行驗證,以便用戶無法保存修復沒有任何修理項目進入?感謝

class Repair < ActiveRecord::Base 
attr_accessible :repair_id, :repairer_id, :fault_num, :vehicle_id, :date_reported, :date_closed, :hours_open, :mileage_open, :reported_to, :reported_by, 
    :repair_items_attributes 

    belongs_to :vehicle 
    belongs_to :repairer 

    has_many :repair_items, :dependent => :destroy 

    validates_presence_of :vehicle_id 
    validates_associated :repair_items 

    accepts_nested_attributes_for :repair_items, :reject_if => lambda { |a| a[:repair_type_id].blank? }, :allow_destroy => true 

end 

class RepairItem < ActiveRecord::Base 
attr_accessible :repair_id, :problem, :solution, :repair_type_id, :priority, :repairer_id, :invoice, :cost, :tax, 
:item_state_id, :mileage_closed, :hours_closed, :date_closed 

    belongs_to :repair 
    belongs_to :repairer 
    belongs_to :repair_type 
    belongs_to :item_state 

    #validates_presence_of :repair_id 
    validates_presence_of :repair_type_id 

    scope :open, where(:item_state_id => 1) 
    scope :monitor, where(:item_state_id=> 2) 
    scope :deferred, where(:item_state_id => 3) 
    scope :closed, where(:item_state_id => 4) 
    scope :cancelled, where(:item_state_id => 5) 

end 

class RepairsController < ApplicationController 

    before_filter :authorise 
    layout :resolve_layout 

def index 
    #status = 1 
    @repairItems = RepairItem.open 
end 

def monitor 
    #status = 2 
    @repairItems = RepairItem.monitor 
end 

def deferred 
    #status = 3 
    @repairItems = RepairItem.deferred 
end 

def closed 
    #status = 4 
    @repairItems = RepairItem.closed 
end 

def cancelled 
    #status = 5 
    @repairItems = RepairItem.cancelled 
end 

def new 
    @repair = Repair.new 
    3.times { @repair.repair_items.build } 
end 

def create 
    # Instantiate a new object using form parameters 
    @repair = Repair.new(params[:repair]) 

    # Save the object 
if @repair.save 
    # If the save suceeds, redirect to the list action 

    redirect_to(repairs_path, :notice => 'Repair Created.') 

else 
    # If the save fails, redisplay the form so user can fix problems 
    render :action => :new 
end 

end 

<%= simple_form_for(@repair, :defaults => { :disabled => @current_user.read_only, :input_html => { :class => "span10" } }) do |f| %> 

<fieldset>  
    <!-- This will display some text in red at the top of the form telling the user --> 
    <%= f.error_notification %> 
    <div class="st-row-fluid"> 

    <div class="span2"> 
     <%= f.association :vehicle, label_method: :fleet_num, value_method: :id, include_blank: true, label: 'Vehicle'%> 
    <p>Current Kms</p> 
    <p>Current Hours</p> 
    <p class="muted">Warranty Expires</p> 
    <p class="muted">Contract Maintenance</p> 

    </div> 

     <div class="span2"> 
     <%= f.input :date_reported, :as => :date_picker, :input_html => { :class => "span10 st-datepicker"} %> 
     <%= f.input :mileage_open, :label => "Km/Miles" %> 
     <%= f.input :hours_open %> 
     </div> 
    <div class="span2"> 
     <%= f.input :fault_num %> 
     <%= f.input :reported_to %> 
     <%= f.input :reported_by %> 
    </div> 

    </div> 

<div class="row-fluid"> 
    <h4> Items</h4> 
    <%= f.simple_fields_for :repair_items do |p| %> 
    <table class="table table-condensed"> 
     <tr> 
      <%= render "repair_items", :p => p %> 
     </tr> 
    </table> 
    <% end %> 
</div> 


    <%= f.error :base %> 
    <div class="st-form-actions"> 
     <% if @current_user.read_only == false %> 
     <%= f.submit nil, :class => 'btn btn-success pull-right' %> 
     <% end %> 
     <%= link_to 'Cancel', repairs_path, :class => 'btn btn-danger pull-right' %> 
    </div> 
</fieldset> 
    <% end %> 

局部

<td><%= p.association :repair_type, label_method: :repair_type_label, value_method: :id, include_blank: true, label: 'Repair Type'%></td> 
<td><%= p.input :problem %></td> 
<td><%= p.input :solution %></td> 
<td><%= p.input :priority %></td> 
<td><%= p.association :repairer, label_method: :rep_name, value_method: :id, include_blank: true, label: 'Repairer'%></td> 
</tr> 
<tr> 
<td><%= p.input :invoice %></td> 
<td><%= p.input :cost %></td> 
<td><%= p.input :tax %></td> 
<td><%= p.input :date_closed, :as => :date_picker, :input_html => { :class => "span10 st-datepicker"} %></td> 
<td><%= p.input :mileage_closed, :label => "Km/Miles" %></td> 
<td><%= p.input :hours_closed %></td> 
<td><%= p.association :item_state, label_method: :state_label, value_method: :id, label: 'Status', :default => 1 %></td> 
+0

我們可以看到一個嘗試嗎?或者代碼? – Senjai 2013-05-14 03:52:38

回答

0

在維修中使用validates_associated :repair_items來驗證修理項目。該行動必須使用repair.RepairItem.build構建修理項目,以便在嘗試保存修理之前將項目與修理相關聯。修理在修理項目之前構建,但repair_items將阻止相關的修理從保存。

+0

感謝isaach1000,我已經將其添加到維修模型中,但它仍然讓父母通過沒有孩子 – jared 2013-05-14 10:42:16

+0

上面的代碼似乎只檢查維修項目的維修ID。如果這是正確的,那麼留空的維修項目將被視爲有效,並且維修將保存。 – isaach1000 2013-05-14 16:48:58

相關問題