2010-02-17 89 views
0

在大多數我看到的例子驗證形式,我注意到,在控制器,新方法只需有:與變量

@object = Object.new 

在創建方法,你會看到類似這樣的:

@object = Object.find(params[:object]) 
    if @object.save 
     flash[:success] = "This object has been added." 
     redirect_to objects_path 
    else 
     render :action => 'new' 
    end 

這工作得很好,但我碰上(很常見)的唯一的事情,就是當檢驗失敗使用一些內置的輔助方法:

validates_presence_of:值

的「渲染:行動=>‘新’將被調用。因此,然後軌繞過控制器,並直接到新的行動,試圖呈現的形式。

控制器的旁路殺死我,因爲有時我用我在我的控制器定義的值裝載值到表單中。

因爲rails會繞過控制器,並且在加載「render:action =>'new'」時從未設置過值,所以我最終會得到nil值的錯誤。

我的問題:在驗證一個表單中已經定義了控制器中定義的變量的表單時,什麼是重定向表單的最佳方式(或通常的最佳實踐)?我想避免那些無價值的錯誤,所以我想我剛開始時做錯了。

回答

1

你可以移動的加載你的各種數值爲before_filter,有點像代碼自定義位:

before_filter :get_values, :only => [:new, :create] 

def new 
    # your code here 
end 

def create 
    @object = Object.new params[:object 
    if @object.save 
    flash[:success] = "This object has been added." 
    redirect_to objects_path 
    else 
    render :action => 'new' 
    end 
end 

private 

def get_values 
    # your code here 
end 
+0

啊哈!答案正在我的臉上。我之前使用過濾器來構建其他東西,而且我從來沒有將它用於表單。謝謝! :) – Steve 2010-02-17 19:48:23

0

一種方法:使所有這些變量的隱藏字段,所以你的目標就已經讓他們在create的行動。 另一種方法:創建這兩個動作before_filter

個人而言,我會選擇第二個選項去。