【问题标题】:conditionally exclude fields from rails form有条件地从 rails 表单中排除字段
【发布时间】:2011-10-21 10:32:08
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    假设您正在为用户模型构建表单。因此在控制器中您将拥有

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

    在形式部分使用

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

    这不会在编辑/更新期间呈现该字段。

    【讨论】:

    • 所有方法都会产生所需的结果,但我喜欢这样,因为没有添加额外的变量,也不会将 params 哈希暴露给视图。
    【解决方案2】:

    你可以这样试一试:

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

    但是您应该考虑安全性,因为这并不能阻止攻击者手动添加 POST 字段以写入在您的表单上显示为字段的字段!

    【讨论】:

    • Rails 在 POST 请求时不会包含任何不在表单中的字段的参数。不太确定,但我认为这就是 CSRF 的用途。感谢您的提醒
    【解决方案3】:

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

    然后在你的局部做

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

    【讨论】:

    • 如何传递一些表单模型字段而不是 bool?更具体地说,如何传递集合中使用 fields_for 和(使用accept_nested_attributes_for)呈现的多个对象之一的字段?
    猜你喜欢
    • 2020-01-02
    • 1970-01-01
    • 2015-04-18
    • 2015-11-14
    • 1970-01-01
    • 2020-02-24
    • 2013-02-21
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多