扩展generated_attribute.rb的困难

时间:2016-03-14 17:22:55

标签: ruby-on-rails ruby ruby-on-rails-4

我尝试扩展 railties-4.2.6 / lib / rails / generated_attribute.rb 以创建两种新类型。我需要这个,因为在运行时

rails g scaffold Contact address:hidden title:select gender:select first_name:string surname:string email:string phones:string

我需要Rails了解它不能为属性地址创建字段,并且必须为标题 HTML select 标记>性别

我写了以下代码:

require 'rails/generators/generated_attribute'

module Rails
  module Generators
    class GeneratedAttribute       

      class << self

        def hidden?
          @field_type == :nofield
        end

        def select?
          @field_type == :select
        end

      end

      def field_type
        @field_type ||= case type
          when :integer              then :number_field
          when :float, :decimal      then :text_field
          when :time                 then :time_select
          when :datetime, :timestamp then :datetime_select
          when :date                 then :date_select
          when :text                 then :text_area
          when :boolean              then :check_box
          when :hidden               then :nofield
          when :select               then :select
          else
            :text_field
        end
      end

    end
  end
end

并将其放在 lib / generators / my_attributes_generator / my_attributes_generator.rb 下,但当我在上面运行 rails g scaffold 命令时,我仍然得到了

(erb):25:in `block in template': undefined method `hidden?' for #<Rails::Generators::GeneratedAttribute:0xcdcf83c> (NoMethodError)

我的脚手架模板上写着

<%- if attribute.hidden? -%>

我尝试了很多方法,但没有任何帮助。现在,我甚至质疑自己是否有可能做到这一点。

1 个答案:

答案 0 :(得分:1)

您应该从单例类中取出hidden?方法,并将其定义为类GeneratedAttribute中的常规方法。因为在hidden?中定义class << self; end方法只能通过GeneratedAttribute.hidden?

访问
require 'rails/generators/generated_attribute'

module Rails
  module Generators
    class GeneratedAttribute     
        def hidden?
          @field_type == :nofield
        end
    end
  end
end

然后此代码<%- if attribute.hidden? -%>将起作用。

让我知道它是否有帮助!