0

Rails 4 date_select:selectedからパラメーターを取り込むために、(Rails 3.2 を実行している) 私のアプリで date_select フォーム ヘルパーをオーバーライドしたいと考えています。

デフォルトの Rails の date_selectをオーバーライドするのは今では少し古いですが、これを参照して機能させようとしていました。

lib/そのため、の下部に含まれるのファイルに次のものがありますenvironment.rb

ActionView::Helpers::Tags::DateSelect.class_eval do
#
# Note: Using ActionView::Helpers::DateTimeSelector as suggested in 
# linked question doesn't error, but also doesn't seem to do anything.
#
  def datetime_selector(options, html_options)
    datetime = options[:selected] || value(object) || default_datetime(options)
    @auto_index ||= nil

    options = options.dup
    options[:field_name]           = @method_name
    options[:include_position]     = true
    options[:prefix]             ||= @object_name
    options[:index]                = @auto_index if @auto_index && !options.has_key?(:index)

    DateTimeSelector.new(datetime, options, html_options)
  end

end

ただし、アプリを起動しようとすると、次のように表示されます。

NameError: uninitialized constant ActionView::Helpers::Tags

これは、コンソールでプレイするときに確認されます。

1.9.3-p327 :001 > ActionView
 => ActionView 
1.9.3-p327 :002 > ActionView::Helpers
 => ActionView::Helpers 
1.9.3-p327 :003 > ActionView::Helpers::Tags
NameError: uninitialized constant ActionView::Helpers::Tags
  from (irb):3
  from /Users/colin/.rvm/gems/ruby-1.9.3-p327/gems/railties-3.2.11/lib/rails/commands/console.rb:47:in `start'
  from /Users/colin/.rvm/gems/ruby-1.9.3-p327/gems/railties-3.2.11/lib/rails/commands/console.rb:8:in `start'
  from /Users/colin/.rvm/gems/ruby-1.9.3-p327/gems/railties-3.2.11/lib/rails/commands.rb:41:in `<top (required)>'
  from script/rails:6:in `require'
  from script/rails:6:in `<main>'

では、なぜActionView::Helpers::Tagsクラスが定義されているのに有効ではないのでしょうか? また、クラスを適切にオーバーライドして datetime_selector メソッドをオーバーライドするにはどうすればよいでしょうか?


答え

Dan が、私が間違ったファイルにモンキー パッチを適用しようとしていると指摘した後、解決策はかなり簡単でした。

ActionView::Helpers::InstanceTag.class_eval do
  def datetime_selector(options, html_options)
    datetime = options.fetch(:selected) { value(object) || default_datetime(options) }

    @auto_index ||= nil

    options = options.dup
    options[:field_name]           = @method_name
    options[:include_position]     = true
    options[:prefix]             ||= @object_name
    options[:index]                = @auto_index if @auto_index && !options.has_key?(:index)

    ActionView::Helpers::DateTimeSelector.new(datetime, options, html_options)
  end
end
4

1 に答える 1

0

ActionView::Helpers::TagsRails 4 の新機能 (4.0 ブランチである rails master ブランチにリンクします) で、Rails 3.2.x アプリで作業している場合、その 3.2stable ブランチのソース コードを確認する必要があります。これは、モンキー パッチdate_selectの場所のように見えます

于 2013-01-16T13:27:52.123 に答える