2011-10-21 101 views
2

我想要實現的功能是根據用戶當前所採取的行動來設置不同的字段。有條件地排除欄的形式

通用支架束的形式進入的部分和使得它在編輯動作。在典型的註冊情況下,每次更新配置文件時都可能不想更新密碼。我過去用來解決這個問題的一種方法是爲新的編輯創建單獨的表格;包括只在新的密碼。顯然,大多數領域都在重演。有沒有辦法保持部分,但省略(從而不更新)表單上每個操作的一些領域?

回答

6

讓我假設你是建立用戶model.So形式,控制器,你將有

def new 
    @user = User.new 
    ..... 
end 

def edit 
    @user = User.find(params[:id]) 
    .... 
end 

在窗體部分使用

<% if @user.new_record? %> 
<%= f.field_type :field_name %> 
<% end %> 

這不會在編輯/更新過程中顯示該字段。

+0

所有方法都會產生所需的結果,但是我喜歡這樣做,因爲沒有額外的變量被添加,並且它不會將params哈希值暴露給視圖。 – iGbanam

0

,您可以嘗試這樣的一個部分:

<% if params[:action] == "new" %> 
    <%= f.field_type :field_name %> 
<% end %> 

但是你應該考慮安全性,因爲這並不從加POST領域保持距離攻擊者手動寫入該ARET顯示字段上你場形成!

+0

在發佈請求時,Rails不會包含任何不在表單中的字段的參數。不太確定,但我認爲這是CSRF的目標。感謝您的高舉 – iGbanam

0

您可以檢查被傳遞給視圖的活動記錄對象(如@user)是新記錄還是舊記錄對象使用方法'new_record?'。基於此,您可以決定要顯示哪些字段。 或者,你也可以有一個部分,然後傳遞給它一些值(最可能是一個布爾值),並根據該值決定渲染哪些字段。 這可以被完成,如: 渲染:部分=> 'partial_name',:當地人=> {:布爾=>真}

,然後在局部做

<% if bool == true %> 
<%= f.xyz_tag :name %> //whatever field you want 
<% end %> 
+0

如何通過一些表單模型字段而不是bool?更具體地說,你如何傳遞一個field_for和(使用'accept_nested_attributes_for')呈現的集合中的多個對象中的一個的字段? –