【问题标题】:ActiveAdmin Form not respecting :multiple => falseActiveAdmin 表单不尊重:multiple => false
【发布时间】:2012-07-28 11:56:00
【问题描述】:

我正在使用 ActiveAdmin 并尝试执行 as::select:collection,这不是多选。

我的代码是:

form do |f|
  f.input :users, :as => :select, :input_html => { :size => 1}, :multiple => false, collection: User.where(role:1), include_blank: false
end

这是在/admin/businesses.rb 中的位置。关系是用户和企业之间存在habtm。我尝试重新排列我的选项,如github issue 所示。我也看过similar stackoverflow question

但是,当我尝试使用 :multiple => false 时,会生成以下代码:

<select id="business_user_ids" multiple="multiple" name="business[user_ids][]" size="1">    
<option value="4">Pilgrim</option>
<option value="5" selected="selected">Mary</option>
<option value="6" selected="selected">Bob</option>
<option value="7">Billy</option>
<option value="8">Ash</option></select>

注意这里选择了两个,多个的代码设置为multiple。有谁知道这是为什么?

另外,我正在尝试弄清楚如何将另一个字段显示为可选字段。

例如,我有 f.inputs :users。有没有办法重命名:users 显示的内容?现在,它显示 users.name,但我想要 users.email。

【问题讨论】:

    标签: ruby-on-rails-3 activeadmin formtastic


    【解决方案1】:

    我也遇到了这个问题。经过一些代码跟踪后,我发现它与底层的 Formtastic 库是二重奏的。

    Formtastic 优先于现有反射(has_many 和 has_and_belongs_to_many)而不是您传入的选项来决定它是否是多重的。

    我认为这是因为在 ?-to-many 关系上强制单选会导致一些混乱。就像你的数据一样,已经有两个选择了,严格的单选应该显示什么?但我稍后可能会向 Formtastic 提出这个问题。

    如果您仍然需要该功能,您可以通过将以下代码放在 config/initializers/formtastic.rb 中进行猴子修补

    module Formtastic
      module Inputs
        class SelectInput
          def multiple_with_options_fix?
            return false if options[:multiple] === false
            multiple_without_options_fix?
          end
    
          alias_method_chain :multiple?, :options_fix
        end
      end
    end
    

    对于第二个问题,您只需将以下代码添加到您的模型中。

    class User < ActiveRecord::Base
      .....
    
      def to_label
        self.email
      end
    end
    

    【讨论】:

    • 谢谢,猴子补丁的作用就像一个魅力。我也会检查 to_label 。有没有办法即时更改 to_label ?例如,如果我想在一个表单上显示 .name,但在另一个表单上我想将 .email 显示为 to_label,这可能吗?
    • 根据rubydoc.info/gems/formtastic/2.0.0/Formtastic/Helpers/…,您可以传递输入选项:member_label,或 :label_method 用于旧版本的 Formtastic
    【解决方案2】:

    虽然 formtastic 在选项哈希中忽略 :multiple => true,但在 input_html 选项中确实尊重它。试一试:

    f.input :users, :as => :select, :input_html => { :size => 1, :multiple => false }, :multiple => false, collection: User.where(role:1), include_blank: false
    

    【讨论】:

    • 这应该是公认的答案。它解决了这个问题,而无需求助于猴子修补 Formtastic。
    【解决方案3】:

    我不确定我是否正确理解了您的问题。您只想更改输入元素的标签还是更改显示的属性类型?如果它只是标签值,那么你可以使用

    f.inputs :users, :label=>"Email"

    我认为没有任何干净的方法可以在运行时更改标签。您可以通过检查参数哈希中的“动作”值来实现它。因此,例如,当您在新操作上显示此视图时,您可以说

    <% if params[:action]="new"%>
    f.inputs :users, :label=>"Email"
    <%else%>
    f.inputs :users, :label=>"Name"
    <%end%>
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2014-06-09
      • 2022-08-22
      • 1970-01-01
      • 2019-06-18
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多