2011-05-24 66 views
2

有一個布爾型字段(使用formtastic),並且該值不會通過錯誤持續存在。如果提交併且存在錯誤,則在重新加載時,布爾字段自動檢查自身,這是不好的。我可以看到問題處於衝突值中,隱藏爲0,而輸入爲1.兩者都應爲0.如何糾正這種情況,以便兩者最初都設置爲0。我哪裏錯了?Rails表單問題

表格代號:

<%= f.input :legal, :as => :boolean %> 

生成的HTML

<li class="boolean optional" id="user_legal_input"> 
    <input name="user[legal]" type="hidden" value="0" /> 
    <label for="user_legal"> 
     <input id="user_legal" name="user[legal]" type="checkbox" value="1" />I Agree to the legal terms 
    </label> 
</li> 

新增:用戶(創建)控制器

def create 
    @user = User.new(params[:user]) 
    respond_to do |format| 
     if @user.save 
     format.js 
     else 
     format.js 
     end 
    end 
    end 

的JS只是重新呈現內聯的所有錯誤的形式

+0

張貼相關的控制器動作(創建/更新)代碼,請 – 2011-05-24 16:36:31

+0

如果你有一個'在你的模型(user.rb)attr_accessible'部分,確保您已將':legal'添加到列表中。 – 2011-05-24 17:30:47

+0

@john Gibb,它是。問題是初始值衝突 – John 2011-05-24 17:33:10

回答

0

隱藏字段總是設置爲「0」以模仿未選中的框,這是正確的行爲: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box

相反,我建議您的isssue是您在模型中的訪問器方法。如果@ user.legal是真實的類型,或者更確切地說,如果

ActionView::Helpers::InstanceTag.check_box_checked?(@user.legal,"1") 

計算結果爲真

複選框輸入被選中。

現在,如果法律是一個布爾數據庫列,軌道初始化將其轉換爲紅寶石布爾所以如果你做

@user = User.new(:legal => "0") 

然後

@user.legal == false 

但如果法律是不是數據庫列(否則:as => :boolean是不必要的),那麼你必須以某種方式定義訪問器方法。

如果你用一個簡單的attr_accessor那麼做了,

@user.legal == "0" 

其正確的計算結果爲未經檢查的框。

,但如果你或你的框架要智取軌和定義:

attr_writer :legal 
def legal 
[email protected] 
end 

或罩(給你一個正確的布爾回)下類似的東西,那你就麻煩了:

此處初始表單顯示!!nil爲false =>未選中框。 ,但在提交/重新加載!!"0"是真=>複選框。

讓我知道如果我的預感是正確的:)

+0

認爲它的工作,但它沒有。:法律不是一個數據庫列,它是一個attr_ccessible,它是問題的一部分。找不到如何將其定義爲訪問器方法 – John 2011-05-26 17:40:23

+0

John您正在使用什麼ORM? ActiveRecord的?您是如何定義合法訪問方法的?你的任務是否做過任何轉化? – 2011-05-27 09:37:56

+0

感謝您的幫助,但我決定遵循您的簡單建議,並添加一個名爲legal的數據庫列。 – John 2011-05-29 23:06:03