【问题标题】:Using the Rails form builder and Draper使用 Rails 表单构建器和 Draper
【发布时间】:2014-12-12 21:13:21
【问题描述】:

我正在尝试使用 Draper 作为助手的替代方案。我得到了我只是格式化信息的情况。但是如何与 Rails 表单构建器交互呢?例如,如果我想根据某些上下文输出字符串或选择框。我是否将表单生成器作为参数传递。所以在我的装饰器中:

def role_or_select form
  available_roles = h.policy_scope User::ROLES
  if available_roles.include? role
    form.input :role, collection: available_roles, include_blank: false
  else
    role
  end
end

那么在我看来:

= simple_form_for user do |form|
  ...
  = user.role_or_select_on form
  ...

还有更优雅的方法吗?

【问题讨论】:

    标签: ruby-on-rails formbuilder draper


    【解决方案1】:

    我想我找到了一个稍微优雅的解决方案。我创建了以下模块并将其混合到我的装饰器中:

    module FormDecoration
    
      def form options={}, &blk
        h.simple_form_for model, options do |builder|
          @form_builder = builder
          blk[builder]
        end
      ensure
        @form_builder = nil
      end
    
      def method_missing meth, *args, &blk
        if @form_builder && @form_builder.respond_to?(meth)
          @form_builder.public_send meth, *args, &blk
        else
          super
        end
      end
    
      def respond_to? meth
        (@form_builder && @form_builder.respond_to?(meth)) || super
      end
    end
    

    现在我的看法可以是这样的:

    = user.form do
      = user.input :name
      = user.input :email
      = user.role_or_select
    

    input 方法被代理到表单构建器。 role_or_select 在我的助手中定义如下:

      def role_or_select
        available_roles = h.policy_scope User::ROLES
        if available_roles.include? object.role
          input :role, collection: available_roles, include_blank: false
        else
          object.role
        end
      end
    

    这甚至允许我做一些事情,比如在装饰器中添加表单选项。例如,将以下内容添加到我的 UserDecorator 将关闭自动完成功能:

    def form options={}
      options[:html] ||= {}
      options[:html][:autocomplete] = 'off'
      super options
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2013-04-20
      • 2011-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      相关资源
      最近更新 更多