有条件地从rails表单中排除字段

时间:2011-10-21 10:32:08

标签: ruby-on-rails ruby-on-rails-3 forms ruby-on-rails-3.1

我想要实现的功能是根据用户当前所处的操作设置不同的字段。

通用脚手架将表单捆绑为部分并将其呈现在编辑操作中。在典型的注册情况下,可能不希望每次更新配置文件时都更新密码。我过去用来解决这个问题的一种方法是为 new edit 创建单独的表单;包括新密码。显然,大多数领域都在重复。是否有办法保留部分但省略(从而不更新)每个操作的表单上的某些字段?

3 个答案:

答案 0 :(得分:6)

让我假设您正在构建用户模型的表单。所以在控制器中您将拥有

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

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

以部分使用形式

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

在编辑/更新期间,这不会渲染字段。

答案 1 :(得分:0)

您可以通过以下方式尝试:

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

但你应该考虑一下安全性,因为这并不能阻止攻击者手动添加POST字段来写入你表格中显示为字段的字段!

答案 2 :(得分:0)

您可以使用方法'new_record?'检查传递给视图的活动记录对象(例如@user)是新记录还是旧记录对象。基于此,您可以决定要显示的字段。 或者,您也可以使用partial,然后传递一些值(很可能是布尔值),并根据该值确定要渲染的字段。 这可以这样做: 渲染:部分=&gt; 'partial_name',:locals =&gt; {:bool =&gt;真}

然后在你的部分做

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