2

Railsにこの(単純化された)ヘルパー関数があります:

include Constants

def link_to_neighbour(direction, path)
  symbol = direction.upcase.constantize
  link_to symbol, path
end

で、lib/constants次の定数を定義しました。

PREVIOUS = "<<"
NEXT = ">>"

しかし、ビューの 1 つでこのようなものを使用すると...

<%= link_to_neighbour('next', @user, user_path(@user)) %>

...私は常にこのエラーを受け取ります:

NameError
uninitialized constant NEXT

ここで何が欠けていますか?

助けてくれてありがとう。

4

3 に答える 3

2

const_missingrubyのフックが使えます。

def self.const_missing(name)
  const_set(name, some_value)
end

しかし、ここでの問題は、アプリケーションの application.rb に「lib/constants.rb」ファイルをロードしていないようです。

この行を「config/application.rb」に入れます

# Autoload lib/ folder including all subdirectories
config.autoload_paths += Dir["#{config.root}/lib/**/"]

この行を「config/application.rb」に入れたくない場合は、constants.rb を lib から「config/initializers/」フォルダーに移動します。Rails アプリケーションは、そこに各ファイルを自動的にロードします。

于 2013-07-16T12:06:58.607 に答える
1

メソッドは次のようになります。

def link_to_neighbour(direction, path)
  symbol = Object.const_get(direction.upcase)
  link_to symbol, path
end

これが役立つことを願っています。

于 2013-07-16T12:11:45.223 に答える
0

私はconstants.yml

directions:
  PREVIOUS: "<<"
  NEXT: ">>"

このようにして、定数のツリーを使用できます。

次に、初期化子で:

Constants = OpenStruct.new YAML.load_file(Rails.root.join('config/constants.yml')).with_indifferent_access

次に、ヘルパー メソッドで:

def link_to_neighbour(direction, path)
  symbol = Constants.directions[direction.upcase]
  link_to symbol, path
end
于 2013-07-16T22:28:58.357 に答える